【问题标题】:How to compare two strings in C?如何比较C中的两个字符串?
【发布时间】:2021-06-18 22:16:25
【问题描述】:

我想比较 2 个字符串,如果它们相等,它应该打印一些东西。我已经看到了一个关于这个的帖子,但它对我不起作用。发帖:How to compare strings in an "if" statement?

代码:

int main(void) {

    char string[100];
    
    printf("Please enter something: ");
    fgets(string, 100, stdin);

    if (strcmp(string, "a") == 0)
        printf("a");

    else if (strcmp(string, "b") == 0)
        printf("b");

    else if (strcmp(string, "c") == 0)
        printf("c");

    else
        printf("something else");


    return (0);
}

虽然我输入了a,但它会打印“其他内容”。

【问题讨论】:

  • 问题很可能是fgets 包含在缓冲区中的换行符。
  • 在这种情况下使用字符串文字,您可以简单地使用memcmp(string, "a", sizeof("a")-1); 或类似的。
  • "but it doesn't work at me" --> 正在工作,您正在正确比较字符串并且它们不相等。只是输入的字符串不是你想的那样。

标签: c newline c-strings fgets strcmp


【解决方案1】:

如果您确实付出了一些研究努力,您可以自己回答这个问题。

int main(void) {

    char string[100];
    
    printf("Please enter something: ");
    fgets(string, 100, stdin);

    if (strcmp(string, "a") == 0)
        printf("a");

    else if (strcmp(string, "b") == 0)
        printf("b");

    else if (strcmp(string, "c") == 0)
        printf("c");

    else
    {
        printf("something else - lets check why:\n Entered string:\n");
        for(size_t n = 0; n <= strlen(string); n++)
        {
            printf("string[%2zu] = ", n);
            switch(string[n])
            {
                case '\n':
                    printf("\\n");
                    break;
                case '\r':
                    printf("\\r");
                    break;
                case 0:
                    printf("null char");
                    break;
                default:
                    if(string[n] < ' ' || string[n] > 127)
                    {
                        printf("\\x%x", (unsigned)string[n]);
                    }
                    else
                    printf("'%c'", string[n]);
            }
            printf("\n");
        }
    }


    return (0);
}

https://godbolt.org/z/afb3Ej7E9

【讨论】:

    【解决方案2】:

    当用户按下 Enter 键 时,fgets() 也会接收换行符。因此,为了从 `string[100] 中存储的内容中删除它,只需更改:

    fgets(string, 100, stdin);
    

    strtok(fgets(string, 100, stdin), "\n");
    

    删除换行符。只需确保包含 #include &lt;string.h&gt; 标头

    进一步阅读

    如果您想知道strtok 的作用,请查看https://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm

    C 库函数 char *strtok(c​​har *str, const char *delim) 使用分隔符 delim 将字符串 str 分成一系列标记。

    char *strtok(char *str, const char *delim)

    【讨论】:

    • strtok(string, "\n"); 无法在缓冲区为 "\n" 时删除 '\n'
    【解决方案3】:

    函数fgets 可以将您应该删除的换行符'\n' 附加到输入的字符串。例如

    fgets(string, 100, stdin);
    string[ strcspn( string, "\n" ) ] = '\0';
    

    fgets(string, 100, stdin);
    char *p = strchr( string, '\n' );
    if ( p != NULL ) *p = '\0';
    

    来自 C 标准(7.21.7.2 fgets 函数)

    2 fgets 函数读取的次数最多小于 1 从流指向的流中由 n 指定的字符 into s 指向的数组。 a 后不读取其他字符 换行符(保留) 或在文件结尾之后。一个空 在读入最后一个字符后立即写入字符 数组。

    【讨论】:

    • 谢谢! if 语句的作用是什么?
    • @puncher 如果在字符串中找不到换行符 '\n',则函数 strchr 返回一个空指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多