不使用C/C++字符串库函数,如何自行编写strcpy( )函数

来源:互联网 发布:聊天自动翻译软件 编辑:程序博客网 时间:2024/05/30 05:02
不使用C/C++字符串库函数,如何自行编写strcpy( )函数

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

首先第1问:
char* strcpy(char* strDest, const char* strSrc){     assert((strDest!=NULL) && (strSrc!=NULL))     if(strDest == strSrc)          return strDest;     char* address = strDest;     while((*strDest++ = *strSrc++)!='\0')     ;     return address;}

然后对于第二问:为了实现链式表达式,关于什么是链式表达式,请自行百度
举个简单的例子:
int length = strlen(strcpy(strDest, "Hello World!"));

本题主要考察以下几点:
(1):检查指针的有效性。如果不检查指针的有效性,说明答题者不注重代码的健壮性
(2):类型的隐式转换。如果检查指针的有效性时使用(!strDest)||(!strSrc)或者(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。例如在本题中,(!strDest)就是将char*隐式转换为bool类型,这种功能虽然灵活,但是更多时候会导致出错,增加维护成本。所以C++中专门增加了bool类型的关键字true、false以提供更安全的条件表达式。
(3):保存原始的strDest值。如果答题者没有保存,则说明答题者逻辑思维不严密。
(4):将循环写成
while(*strDest++ = *strSrc++)
对隐式类型转换认识不足
while(*strSrc!='\0')     *strDest++ = *StrSrc++; 
说明答题者对边界条件的检查不足。上面的写法无法将strSrc结尾的零赋给strDest。可以修改如下:
while(*strSrc != '\0')     *strDest++ = *strSrc++;*strDest = '\0';
(5):对于返回值的问题
  • 如果返回的是一个新的其它的字符串,说明答题者根本就不知道返回值的作用,或者说不知道返回值是用来干什么的,并且也没考虑到内存泄露的问题。
  • return 0; 说明答题者没有掌握异常机制。调用者可能会忘记检查返回值,还有可能无法检查返回值。
原创粉丝点击