首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

对strcpy函数实现代码的一点疑问解决方案

2012-05-28 
对strcpy函数实现代码的一点疑问百度百科里看见strcpy函数的一个面试题代码,就是自己实现一下,百科里给的

对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 标签, 

使你的代码看起来,更舒服。
这样,更容易有人帮助你。

C/C++ 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三个关键字以提供更安全的条件表达式。
[解决办法]
这是源码
C/C++ code
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语言中类型的隐式转换没有深刻认识。”

以上个人拙见。

热点排行
Bad Request.