5

由于未知原因,运行我的 C 程序的结果非常出乎意料。我认为它必须是某种初学者的错误,但是我真的不知道它在哪里。

#include <stdio.h>
#include <string.h>
int main()
{
char string1[50];
char string2[50];
int compare;

puts("Enter two strings: ");
fgets(string1, strlen(string1)+1, stdin);
fgets(string2, strlen(string2)+1, stdin);

compare=strcmp(string1, string2); /* usage of extra variable makes the code more readable but wastes more memory */

printf("%d: ",compare);

if (compare<0) puts("First string is lesser");
else if (compare>0) puts ("First string is bigger");
     else puts("Strings are equal");


return 0;
  }

在测试中:

Enter two strings: 
heheisntthisalongstring
heheisntthisalongstring
1: First string is bigger


------------------
(program exited with code: 0)
Press return to continue

这些字符串不应该相等吗?

4

4 回答 4

13
fgets(string1, strlen(string1)+1, stdin);
fgets(string2, strlen(string2)+1, stdin);

这些都是错误的。string1并且string2没有初始化,strlen只是计算字节数,直到达到\0. 在这种情况下,strlen可以返回任何(随机非负数)数字。

使用sizeof, 而不是strlen这里。

于 2012-08-24T11:22:59.347 回答
3

这里

 char string1[50]; 
 char string2[50]; 

你没有初始化它们,所以你的初始调用strlen是不可靠的,因为它们正在寻找他们在数组开始后找到的第一个空字符。这可能在任何地方,调用的结果可能会或可能不会真实反映大小 - 你根本不能依赖结果。

于 2012-08-24T11:24:10.543 回答
0

string1不是 memset 为 0,所以strlen(string1)value 不会给出期望值 ( 50)。strlen将计算字符直到达到\0. 所以它也可能导致崩溃(一种未定义的行为)。

更好的 memset string1string2如下所示。

char string1[50] = {0}; 
char string2[50] = {0};

并且还使用sizeof运算符来获取值50

fgets(string1, sizeof(string1), stdin); 
fgets(string2, sizeof(string2), stdin);

或者直接去scanf

scanf("%s", string1);
scanf("%s", string2);
于 2012-08-24T11:37:23.207 回答
0

这里看看this-strlen

尽管您使用的代码不好,但您仍然可以通过使用公共字符串变量strncmp的第三个参数来获得预期的答案。strlen纯娱乐。始终初始化您的变量,否则它们会导致您的应用程序崩溃。您可以在此处查看示例-strncmp

于 2012-08-24T11:45:08.607 回答