对strcpy函数实现代码的一点疑问
百度百科里看见strcpy函数的一个面试题代码,就是自己实现一下,百科里给的代码是:
char * strcpy(char * strDest,const char * strSrc)
{
char * strDestCopy=strDest; //[3]
if ((strDest==NULL)||(strSrc==NULL)) //[1]
throw "Invalid argument(s)"; //[2]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy;
}
后面解说是:
错误的做法:语句[1],如果 检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。
为什么不能直接对指针做取非'!'判断?不能if(!p)??
ps:就是空指针判断问题。
[解决办法]
使用 code 标签,
使你的代码看起来,更舒服。
这样,更容易有人帮助你。
char * strcpy(char * strDest,const char * strSrc) { char * strDestCopy=strDest; //[3] if ((strDest==NULL)||(strSrc==NULL)) //[1] throw "Invalid argument(s)"; //[2] while ((*strDest++=*strSrc++)!='\0'); //[4] return strDestCopy; }
[解决办法]
如果楼主能看全,该有多好,
(B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。
[解决办法]
这是源码
char *strcpy(char *dest, const char *src){ char *tmp = dest; while ((*dest++ = *src++) != '\0') /* nothing */; return tmp;}
[解决办法]
一般情况下那样写不会出错。但是为了代码的可读性,写成if(strDest==NULL)||(strSrc==NULL))会让人一看就明白strDest和strSrc是指针,而不是代表0或1的数
[解决办法]
个人觉得跟隐式转换没什么关系,因为对结果没影响
[解决办法]
((!strDest)||(!strSrc))或(!(strDest&&strSrc)) 隐藏了char*->bool的转换,虽然本例中无问题,但是并不可取,最起码代码可读性差。
[解决办法]
楼主还不结啊,咱商量商量,别把写百科的人当成语文系的行不,顺便楼主也好好学学语文,,什么是上下文
(B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。
[解决办法]
这里说的是“错误的做法”。我记得好像哪篇资料谈过这方面的东西。if(!p)不是说不可以,而是说应该根据上下文的情景来进行使用。
不过我觉得这里给的错误理由不是很好:“说明答题者对C语言中类型的隐式转换没有深刻认识。”
以上个人拙见。