面试中strcpy源码的判分标准

来源:互联网 发布:java随机昵称生成器 编辑:程序博客网 时间:2024/05/27 12:21

如果编写一个标准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,以便实现链式表达式这样的机制。

0 0
原创粉丝点击