看面试题的时候有个题目是不使用库函数,实现strcpy函数.(字符串拷贝函数)
这个是我写的代码,在机器上编译过了.
void my_strcpy(char *t,char *s){ while((*t++=*s++)); }
看了很多帖子,发现我这个代码的问题还是很多的.即使这么简单的一个小程序也有很多的东西需要考虑.下面总结:
1.关于函数返回值.我写的是void,即函数不返回参数.所以我这个函数的唯一目的是将s地址字符串复制到t上.不返回任何信息.这样写的代码在以后使用是不方便的.林锐<高质量C/C++编程指南>里提到:返回char *的目的是为了实现链式表达式.如:
int length=strlen(strcpy(strDest,"HelloWorld"));//如果没有返回char *那么要多写几行代码非常麻烦.
2.保留原串的问题.
正因第一个错误犯下导致了第二个错误的直接产生,那就是保留目标串首地址的问题.既然要返回目标串的话肯定是返回目标串的首地址.即return t.而在函数里对t要进行地址移动操作,所以在开始要保存t的地址.
char *strDest=t; //t的地址保留在strDest,这样直接返回strDest即可,而可以操作t.
3.关于源串,目标串的检查问题.
这个主要是检查源串,目标串指针的合法性.
assert((t!=NULL) && (s!=NULL)); //如果t,s均!=NULL那么就继续执行,如果不是的话并退出程序并输出错误信息.
这样一来,比较合格的strcpy()函数完成:(这个也是林锐博士在高质量C/C++编程当中的源代码)
char *my_strcpy(char *t,char *s){ char *strDest=t; assert((*t)!=NULL && (*s)!=NULL); while((*t++=*s++)); return strDest; }
其实在GNU C的strcpy源代码当中并没有对串指针合法性的检测.看了网上帖子大家争论的原因是:assert()这个函数非常的繁琐耗时.所以GNU C是为了提高效率,而且本意是如果出错则程序会crash,而检查crash则是程序员慢慢调试.库函数则是以效率为先!