C/C++笔试(二)(C库(4)——strcpy实现)

时间:2022-03-17 04:51:57

  最近面试,笔试试题遇到关于strcpy函数的实现问题,整体实现思路不难,但涉及到一些细节问题,而面试官的主体意思应该也就是考察面试者对于细节处理问题。面试完毕,后面查阅网络上相关答案,发现自己还是考虑不周全,出现细节错误。

题目:
已知strcpy函数的原型是:
char * strcpy(char * strDest,const char * strSrc);
1)不调用库函数,实现strcpy函数。
2)解释为什么要返回char *。

本人填写的答案:
1)实现代码

char *strcpy(char *strDest, const char *strSrc)
{
    if((strDest==NULL) || (strSrc ==NULL))
        return NULL;                                            
    while( (*strDest++ = * strSrc++) != '\0' );
    return strDest ;                                                 
}

2)实现链式表达,如函数可以作为其他函数的传入入参数。

答案分析:
对于问题2,回答正确。问题1则存在一些错误和争议,具体如下:
1)返回指针不对,此时strDest 的地址指向字符串末尾,应该返回目的字符串的首地址,正确做法是,在函数内定义一个临时指针变量p,指向strDest 的首地址,后面操作strDest 指针,不影响p指针指向。
2)网络上的标准答案是采用断言,个人觉得本人用if条件判断检查空内存(字符)也是可以的。
3)关于结束符,网络上某些答案,是在结束while循环后,需增加一句增加结束符的语句,即是

*strDest = '\0';

对于此,个人分析,主要是针对while循环语句

while( (*strDest++ = * strSrc++) != '\0' );

按照运算符优先级,先执行赋值操作,再执行指针地址自增,第三步才是检查目的字符串strDest当前地址是否为结束符。因此,该语句操作,已经将源字符串srcDest的结束符赋值到目的字符串strDest中。故,不需手动增加结束符。

正确答案为:

strcpy char *strcpy(char *strDest, const char *strSrc)
{   
    char *p;

    assert((strDest!=NULL) && (strSrc !=NULL)); 
    p = strDest; 
    while( (*strDest++ = * strSrc++) != ‘\0’ );
    return p;
}