面试中strcpy源码的判分标准

本文详细探讨了如何正确实现C语言标准库函数strcpy,并通过不同得分的示例,展示了从基本功能到高级特性的提升路径。强调了编程规范、参数有效性检查、返回值优化等关键点,旨在帮助读者深入理解并掌握这一基础但至关重要的函数实现。

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

如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:

  2分

void strcpy( char *strDest, char *strSrc )
  {
  while( (*strDest++ = * strSrc++) != ‘\0’ );
  }

  


4分


 void strcpy( char *strDest, const char *strSrc )
  //将源字符串加const,表明其为输入参数,加2分
  {
  while( (*strDest++ = * strSrc++) != ‘\0’ );
  }



  7分


void strcpy(char *strDest, const char *strSrc)
  {
  //对源地址和目的地址加非0断言,加3分
  assert( (strDest != NULL) &&(strSrc != NULL) );
  while( (*strDest++ = * strSrc++) != ‘\0’ );
  }



  10分


char * strcpy( char *strDest, const char *strSrc )

//将源字符串加const,表明其为输入参数,加2分

  {
  assert( (strDest != NULL) &&(strSrc != NULL) );

//对源地址和目的地址加非0断言,加3分

  char *address = strDest;
  while( (*strDest++ = * strSrc++) != ‘\0’ );//2分
  return address;

//为了实现链式操作,将目的地址返回,加3分!
  }

从2分到10分的几个答案我们可以清楚的看到,需要多么扎实的基本功才能写一个完美的strcpy。


#include <assert.h>

char *strcpy(char *dst, const char *src)
{
assert((dst != NULL) && (src != NULL));
char *tmp = dst;
while ((*dst++ = *src++) != '\0') {
/* nothing */;
}
return tmp;
}

需要注意几个方面的问题:

1、注意编程风格。比如,使用dst、src这样增强可读性的名字。

2、使用断言assert来检验输入参数的有效性。

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回false,则终止程序执行。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。

3、使用const来约束src,表明src对应的内容不能被修改。

4、返回dst,以便实现链式表达式这样的机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值