为什么我的strcmp实现没有返回正确的值?

时间:2012-06-20 08:48:56

标签: c++ c

为什么这个打印在主打印时返回0,但是当它在strcmp函数内时打印为6?

  7 int main()
  8 {
  9 char* str = "test string";
 10 char* str2 = "test strong";
 11 //printf("string length = %d\n",strlen(str));
 12 
 13 int num = strcmp(str,str2);
 14 
 15 printf("num = %d\n",num);
 16 }




 29 int strcmp(char* str, char* str2)
 30 {
 31   if(*str == '\0' && *str2 == '\0')
 32     return 0;
 33   if(*str2 - *str == 0)
 34   {
 35     strcmp(str+1,str2+1);
 36   }
 37   else
 38   {
 39     int num = *str2 - *str;
 40     cout << "num = " <<num<<endl;
 41     return num;
 42     }
 43 }

输出结果为:

num = 6 num = 0

为什么显然应该返回的值是6时才打印0?

2 个答案:

答案 0 :(得分:8)

您是否忘了添加return声明?

 33 if(*str2 - *str == 0)
 34   {
 35     return strcmp(str+1,str2+1);
 36   }

否则,代码将跳过if语句的其余部分并到达函数的末尾,不返回任何内容(或0,但这很幸运)。

只有当两个字符串的第一个字符彼此不同时,您的代码才有效。或者两个字符串都是空的。

你的编译器应该警告你这件事;从void函数返回non void。如果没有,您应该使用-Wall编译:)

答案 1 :(得分:4)

这是问题所在:

if(*str2 - *str == 0)
{ 
    strcmp(str+1,str2+1); /* no return here. */
}

意味着代码将一直延伸到结束,其中没有return,这是未定义的行为:

  • 来自C99标准的 6.9.1功能定义部分:
  

如果到达了终止函数的},并且调用者使用了函数调用的值,则行为是未定义的。

  • 来自 6.6.3 C ++ 03标准的返回语句
  

离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。

由于行为未定义,任何事情都可能发生。在这种情况下,会返回0

更改为:

if(*str2 - *str == 0)
{ 
    return strcmp(str+1,str2+1);
}