关于strcpy和strncpy的面试题

    技术2026-01-03  8

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

     

    Processed: 0.039, SQL: 9