Strcpy / Strncpy的工作方式

来源:互联网 发布:社交网络百度网盘 编辑:程序博客网 时间:2024/05/18 02:09
Strcpy的函数原型: char *strcpy(char *dst, const char *src)函数功能: 将字符串src拷贝到字符串dst中去。用法解析: 在执行字符串拷贝之前,“用户需要保证”dst指向的空间足够大。否则的话,可能会产生意想不到的后果。 如果dst所指向的空间不足以存储src中的字符串的话,不要以为只是遗失了src中存储不下的字符串这么简单。 在VC的库函数中,strcpy()的定义如下: char * __cdecl strcpy(char * dst, const char * src){ char * cp = dst; while( *cp++ = *src++ ) ; /* Copy src over dst */ /*注意这行有个分号*/ return( dst );} 需要留意的是,这个函数定义中的循环语句:while( *cp++ = *src++ );这个循环会一直执行,直到循环条件为0。注意这里的0不是数字里的零,而是ASCII码中的0。也就是’/0’。也就是说,如果dst所指向的存储空间不够大的话,这个函数会将src中的部分内容拷贝到dst所指内存空间后面的内存中。而dst所指空间后面的内存却是不可知的,有可能已经被其它资源占用了,这样就会破坏掉原先存储的内容,导致系统崩溃。 因为strcpy在执行字符串拷贝的时候,会从src所指位置开始,检测当前内存单元中存储的数据是否为‘/0’。如果不为‘/0’,则将这个内存单元中的数据拷贝到dst所指向的内存中。如果src中存储的字符串长度大于dst所申请的内存空间的话,就会产生越界,造成不可预知的后果。 Strncpy的函数原型: char *strncpy(char *dest, const char *src,int count)函数功能: 将字符串src中的count个字符拷贝到字符串dest中去。 用法解析: 这个函数和strcpy类似,当src的长度大于dst申请的空间的时候,情况和strcpy一样;如果第3个参数count的值大于src中字符串的长度的话,就会将字符串src拷贝到dst中,返回函数。 示例程序: #include // #include // for getch() #include // for stycpy() using namespace std; int main(){ int i = 0; char dst[11] = "1234567890"; char src[15] = {'1','2','3','4','5','/0','7','8','9','0','1','2','3','4'}; strcpy( dst, src ); cout<<"strcpy()"< 功能:由src所指内存区域复制count个字节到dest所指内存区域。 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。 举例: // memcpy.c #include #include 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; } strcpy是拷贝字符串,以/0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止) strcpy的原型为 char *strcpy(char *dest, const char *src) 而memcpy是给定来源和目标后,拷贝指定大小n的内存数据,而不管拷贝的内容是什么(不仅限于字符) memcpy的原型为 void *memcpy(void *dest, const void *src, size_t n);