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

xiaoxiao2021-02-28  103

不使用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; 说明答题者没有掌握异常机制。调用者可能会忘记检查返回值,还有可能无法检查返回值。
转载请注明原文地址: https://www.6miu.com/read-34824.html

最新回复(0)