strcpy和memcpy都是用于从一块内存复制一段连续的数据到另一块内存,区别是终结标识不同。
strcpy(a, b)从b复制内容到a,然后从b+1复制内容到a+1,依次类推,知道b+i的内容是'\0'。要小心的是1:确保b是以'\0'结尾的字符串;2:确保a开始有足够的可用内存。通常用strncpy(a, b, c)会好一些,这时复制的数据最长不超过c字节。 memcpy(a, b, c)从b开始复制c字节内容到a。相比strcpy,memcpy是确定复制c个字节的。所以只要保证b开始有c字节有效数据,a开始有c字节内存空间就行。 要小心的是:memcpy对于重叠内存的复制支持不太好。重叠内存是指 char a[10]的话,memcpy(a, a + 3, 5)这样的,源数据是a+3到a+7,目标位置是a到a+5,有重复。 如果希望覆盖,可以用memmove。
用法:#include <string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。 举例: // memcpy.c #include <syslib.h> #include <string.h> main() { char *s="Golden Global View"; char d[20]; clrscr(); memcpy(d,s,strlen(s)); d[strlen(s)]=0; printf("%s",d); getchar(); return 0; } 而strcopy复制字符串不检查字符串长度,经常造成缓冲区溢出,请谨慎使用 前面是拷贝字符串,后面是拷贝内存内容。
能用strcpy的地方肯定能用memcpy,反过来不成立。strcpy拷贝时遇到'\0'就结束,而memcpy则拷贝指定长度的内存数据,而不管是否有'\0' strcpy是拷贝字符串,以\0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止)
strcpy的原型为 char *strcpy(char *dest, const char *src) 而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么(不仅限于字符) memcpy的原型为 void *memcpy(void *dest, const void *src, size_t n); 1.strcpy: 从src向dest拷贝字符,一个一个拷贝,当在src内发现绝对0['\0']的时候,拷贝结束,在dest目标指针的最后也会加上一个绝对0['\0'];这个绝对0很有用...
2.memcpy:从src向dest一个字节一个字节的拷贝,当拷贝完第3个参数指定的长度之后,拷贝结束,也可以对memcpy做优化,4个字节拷贝... |
|