strcmp()认为字符串不相等..但是它们呢?

时间:2012-08-24 11:21:00

标签: c compare fgets strcmp

由于未知原因,运行我的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 个答案:

答案 0 :(得分:13)

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

这些都是错的。 string1string2未初始化,strlen只计算字节数,直至达到\0。在这种情况下,strlen可以返回任何(随机非负数)。

使用sizeof,而不是strlen

答案 1 :(得分:3)

下面

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

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

答案 2 :(得分:0)

string1不会将memset设置为0,因此strlen(string1)值不会给出预期值(50)。 strlen将对角色进行计数,直至达到\0。所以它也可能导致崩溃(一种未定义的行为)。

最好记住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);

答案 3 :(得分:0)

以下是this-strlen

虽然您使用的代码不是很好,但您仍然可以通过使用strncmp为第3个参数提供公共字符串变量的strlen来获得预期的答案。纯娱乐。 始终初始化变量,否则会导致应用程序崩溃。您可以看到示例here- strncmp