C:使用strcmp

时间:2017-03-13 14:32:37

标签: c string fgets strcmp

作为初学者,我一直在使用库string.h的一些功能,并且在函数strcmp方面存在一些问题。

我写了比较两个字符串的程序。如果它们相等,则返回YESNO

#include <stdio.h>
#include <string.h>

int main() {

    char a[100];
    char b[15] = "hello";

    fgets(a, 100, stdin);

    int compare;

    compare = strcmp(a, b);

    if(compare == 0) {

        printf("YES");
    }
    else {

        printf("NO");
    }

    return 0;
}

即使我从键盘上输入hello,我也会运行它NO。当我添加第printf("%d", compare)行时,结果表明,对于任何输入,我得到1,即a中的停止字符大于b中的停止字符。

我的错误在哪里?

3 个答案:

答案 0 :(得分:4)

fgets(a, 100, stdin);也会将您输入的换行符存储到缓冲区中。因此a包含"hello\n"。这个额外的角色抵消了比较。

您可以尝试通过某种方式删除换行符 1 ,或者与strncmp进行比较。

  1. 例如:

    char *newline = strchr(a, '\n');
    if (newline)
      *newline = '\0';
    

答案 1 :(得分:4)

这不是扫描错误,但问题是,fgets()扫描并将尾随换行符存储到提供的缓冲区中。如果你要将缓冲区与不包含终止换行符的字符串文字进行比较,你需要摆脱它。

要剥离尾随换行符,您可以使用类似

的内容
size_t len = strlen(a);
if (len > 0 && a[len-1] == '\n') {
    a[--len] = '\0';
}

See this answer for more reference

如果没有删除换行符,strcmp()将不会宣布比​​较为成功。

否则,您可以使用strncmp()并提供字符串文字的大小,以使比较仅限于有效输入。

答案 2 :(得分:4)

如果源数组中有足够的空间,

fgets会追加与Enter键对应的换行符。

在将字符串与另一个字符串进行比较之前,您应该删除该字符

a[strcspn( a, "\n" )] = '\0';

例如

#include <stdio.h>
#include <string.h>

int main() {

    char a[100];
    char b[15] = "hello";

    fgets(a, 100, stdin);

    a[strcspn( a, "\n" )] = '\0';

    int compare;

    compare = strcmp(a, b);

    if(compare == 0) {

        printf("YES");
    }
    else {

        printf("NO");
    }

    return 0;
}