strcpy与strncpy工作方式及其区别
strcpy中的循环语句:
while ((*strDest++ = *strSrc++) != '\0')
这个循环会一直执行,直到循环条件为空,即'\0',也就是说,如果strDest所指的存储空间不够大的话,这个函数会将strSrc中的部分内容拷贝到strDest所指内存空间后面的内存中。而strDest所指空间后面的内存却是不可知的,有可能已经被其他资源占用了,这样就会破坏原先存储的内容,导致系统崩溃。
因为strcpy在执行字符串拷贝的时候,会从strSrc所指位置开始,检测当前内存单元中存储的数据是否为'\0'。如果不为'\0',则将这个内存单元中的数据拷贝到strDest所指向的内存中。如果strSrc中存储的字符串长度大于dst所申请的内存空间的话,就会产生越界,造成不可预知的后果。
strncpy的函数原型:
char *strncpy(char *dest, const char *src,int count)
函数功能:
将字符串src中的count个字符拷贝到字符串dest中去。返回指向s1的指针
用法解析:
这个函数和strcpy类似,当src的长度大于dst申请的空间的时候,情况和strcpy一样;
如果第3个参数count的值大于src中字符串的长度的话,就会将字符串src拷贝到dst中,返回函数。
区别:
第一种情况:
1 char* p="how are you ?";
2 char name[20]="ABCDEFGHIJKLMNOPQRS";
strcpy(name,p); //name改变为"how are you ? " ====>正确!
strncpy(name,p,sizeof(name)) //name改变为"how are you ? " ====>正确!
经过vc验证:两种都是how are you ?
第二种情况:
1 char* p="how are you ?";
2 char name[20];
strcpy(name,p); //name改变为"how are you ? " ====>正确!
strncpy(name,p,sizeof(name)); //name改变为"how are you ? " ====>正确!
第三种情况:
1 char* p="how are you ?";
2 char name[10];
strcpy(name,p); //目标长度小于源串===》错误!
strncpy(name,p,sizeof(name)); //源串长度大于指定拷贝的长度sizeof(name),在这种情况下不会自动在目标串后面加'\0' 。
name[sizeof(name)-1]='\0';//和上一步组合,弥补结果
strncpy
如果目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上'/0'
如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括'/0',
如果指定长>目标长,error happen!
总结:
strcpy(),以源串中的'/0'为拷贝结束标志,直到遇到该'\0'为止,然后将'\0'拷贝上.
strncpy()以第三个参数N为拷贝结束标志,如果source的长度小于N,则剩余的字符全部用'\0'填充.
如果source的长度大于N,则从source中截取前N个字符,拷贝过去.不包括'\0'