1.strcpy
原型声明:extern char *strcpy(char *dest,char *src);
功能:把 src 所指由 NULL 结束的字符串复制到 dest 所指的数组中。
说明:src 和 dest 所指内存区域不可以重叠且 dest 必须有足够的空间来容纳 src 的字符
串。
返回 指向 dest 的指针。
#include<assert.h>
#include<string.h>
char *strcpy(char *strDestination, const char *strSource)
{
Assert((strDestination!=NULL) && (strSource!=NULL));
char *strD=strDestination;
while ((*strDestination++=*strSource++)!='\0')
NULL;
return strD;
}
题目:
已知 strcpy 函数的原型是:
char * strcpy(char * strDest,const char * strSrc);
1.不调用库函数,实现 strcpy 函数。
2.解释为什么要返回 char *。
错误的做法:
[1]
(A)不检查指针的有效性,说明答题者不注重代码的健壮性。
(B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!
(strDest&&strSrc)),说明答题者对 C 语言中类型的隐式转换没有深刻认
识。在本例中 char *转换为 bool 即是类型隐式转换,这种功能虽然灵活,
但更多的是导致出错概率增大和维护成本升高。所以 C++专门增加了
bool、true、false 三个关键字以提供更安全的条件表达式。
(C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答
题者不知道使用常量的好处。直接使用字面常量(如本例中的 0)会减少程
序的可维护性。0 虽然简单,但程序中可能出现很多处对指针的检查,万一
出现笔误,编译器
不能发现,生成的程序内含逻辑错误,很难排除。而使用
NULL 代替 0,如果出现拼写错误,编译器就会检查出来。
[2]
(A)return new string("Invalid argument(s)");,说明答题者根本
不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数
体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用
者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。
(B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查
返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返
回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。