由于未知原因,运行我的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
这些字符串不应该相等吗?
答案 0 :(得分:13)
fgets(string1, strlen(string1)+1, stdin);
fgets(string2, strlen(string2)+1, stdin);
这些都是错的。 string1
和string2
未初始化,strlen
只计算字节数,直至达到\0
。在这种情况下,strlen
可以返回任何(随机非负数)。
使用sizeof
,而不是strlen
。
答案 1 :(得分:3)
下面
char string1[50];
char string2[50];
你没有初始化它们,所以你对strlen
的初始调用是不可靠的,因为他们正在寻找他们在数组开始后找到的第一个空字符。这可能是在任何地方,呼叫的结果可能或可能不是对大小的真实反映 - 你根本不能完全依赖结果。
答案 2 :(得分:0)
string1
不会将memset设置为0,因此strlen(string1)
值不会给出预期值(50
)。 strlen
将对角色进行计数,直至达到\0
。所以它也可能导致崩溃(一种未定义的行为)。
最好记住string1
和string2
,如下所示。
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