为什么看起来字符串不相等?

时间:2018-12-19 18:54:19

标签: c string fgets strcmp

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;
}

2 个答案:

答案 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;
}