为什么这个打印在主打印时返回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?
答案 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
,这是未定义的行为:
如果到达了终止函数的},并且调用者使用了函数调用的值,则行为是未定义的。
离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。
由于行为未定义,任何事情都可能发生。在这种情况下,会返回0
。
更改为:
if(*str2 - *str == 0)
{
return strcmp(str+1,str2+1);
}