最近面试,笔试试题遇到关于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;
}