关于strcpy和strncpy的面试题

问题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*

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章