int main()
{
int n = 100;
char a[n];
char b[ ]="house";
fgets(a,n-1,stdin); // type "house"
if (strcmp(a,b) == 0)
printf("The strings are equal.\n");
else
printf("The strings are not equal.\n");
return 0;
}
答案 0 :(得分:3)
原因为何
if (strcmp(a,b) == 0) { }
不正确,因为fgets()
将\n
存储在缓冲区的末尾。因此,这里的数组a
看起来像house
,而数组b
看起来像house\n
(如果在输入输入字符后按下了ENTER
键)和strcmp(a,b)
不返回0
。
在fgets()
的手册页中
fgets()
从流中读取的字符数最多不超过大小字符 并将它们存储到s指向的缓冲区中。阅读停止 在EOF或换行符之后。 如果已读取换行符,则将其存储 。终止空字节('\ 0')存储在后面 缓冲区中的最后一个字符。
一种方法是使用strcspn()
来删除结尾的\n
。对于例如
fgets(a,n,stdin);
a[strcspn(a, "\n")] = 0;
现在像比较char数组
if (strcmp(a,b) == 0) {
printf("The strings are equal.\n");
}
else {
printf("The strings are not equal.\n");
}
答案 1 :(得分:0)
在您的示例中,这就是strcmp正在比较的
strcmp("house\n", "house")
哪个是假的。
这是您可以添加的解决方案,用于将代码固定为您期望的工作方式(我认为)。
int main()
{
int n = 100;
char a[n];
char b[] = "house";
fgets(a, n-1, stdin);
a[strlen(a) - 1] ='\0'; //you may want to add length checking to prevent errors if user input is null
if (strcmp(a, b) == 0)
printf("The strings are eq\n");
else
printf("Not eq\n");
return 0;
}