问题1:strcpy()和strncpy()的区别
1.首先两个函数的参数不同,所以功能不是完全相同。strncpy()比strcpy()多一个参数n,表示拷贝前n个字符。而strcpy()则是拷贝全部字符。
2.因为strncpy中有参数n的存在,所以它只负责复制前n个字符,没复制字符串结尾的标记’\0‘。strcpy()则复制了’\0‘。
3.两者的错误处理,当strncpy()中规定复制的长度n大于目标的长度时会直接报错;strcpy()如果目标的长度小于原长度的话则是能复制多少复制多少。
char* strcpy(char *dest, const char *src)
{
if(src==NULL)
{
return NULL;
}
while(*src!='\0')
{
*dest++=*src++;
}
*dest='\0';
return dest;
}
char* strncpy(char *dest, const char *src,int n)
{
if(src==NULL)
{
return NULL;
}
while(n&&(*dest++=*src++;*dest++=*src++))
n--;
if (count)
while (--count)
*dest++ = '\0';
return(start);
return dest;
}
问题2:为什么返回dest副本
没什么实际意义,为了方便函数调用设计,就比如int len=strlen(strcpy(arr,"hello word"));
否则就需要:
int *arr;
strcpy(arr,"hello word");
int n=strlen(arr);
比起这三行代码还是那一行毕竟省事,这个也叫链式表达式。只是为了方便,仅此而已
问题3:两个函数的缺陷,如何解决
两者都不安全,strcpy()中当目标数组的长度小于原来数组的长度进行拷贝时会造成栈溢出,可能会修改其它内存的内容;strncpy()没有提供遇NULL终止,而是一直找’\0‘所以当目标数组很小但n值很大就不安全.还有就是目标数组很大,n比原始数组的长度大时,会把目标数组的多余部分全部赋值成’\0‘
解决:最后使用strnpy_s函数,该函数在strncpy()的基础上还多了一个参数,该参数表示是目标数组的字节大小,可以解决目标数组空间不够的问题,返回值也是返回的错误代码而不是char*