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

本文详细探讨了strcpy函数的实现细节,包括如何正确处理空指针情况、返回值的合理选择以及字符串结束符的处理等问题,并对比了不同实现方式的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近面试,笔试试题遇到关于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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acuity.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值