【问题标题】:Why comparing strings in C doesn't work?为什么在 C 中比较字符串不起作用?
【发布时间】:2011-09-20 04:54:37
【问题描述】:

我有以下程序

main()
{

    char name[4] = "sara";
    char vname[4] = "sara";

    if(strcmp(name, vname) == 0)
    {
        printf("\nOK");
    }
    else
    {
        printf("\nError");
    }

}

这个程序总是打印“错误”...这里有什么问题帮助我

但如果我更改 char vname[] = "sara",那么它会打印出 "OK"... 为什么??

【问题讨论】:

  • 这与问题不是特别相关,但 C++ 不允许 char name[4] = "sara";;如果指定大小,则必须有足够的空间容纳尾随的 '\0'

标签: c


【解决方案1】:

您正在硬调整数组的大小,以至于它们对于字符串来说太短了(它们不包含用于空终止符的附加字符)。因此,在进行比较时,strcmp 会超出字符串的末尾,从而产生本质上不可预测的结果。你很幸运没有遇到段错误。

【讨论】:

  • 如果他 遇到 seg 错误会更幸运。
  • 那么您能告诉我在 c 中分配字符串或创建字符串的最佳方法是什么吗?请
  • srisar:正如其他人所建议的,您可以在数组声明中省略显式维度值,编译器将根据它们的初始值设定值(例如,char name[] = "sara") .
【解决方案2】:

如果这偏离了轨道,请原谅我,因为我已经很久没有学过 C 语言了!

main()
{
    char name[] = "sara";
    char vname[] = "sara";

    if(strcmp(name, vname) == 0)
    {
        printf("\nOK");
    }
    else
    {
        printf("\nError");
    }
}

您已经为 char 数组指定了硬长度,但在 C 中,字符串以空结尾,因此“sara”实际上需要 len 5,而不是 4。

【讨论】:

    【解决方案3】:

    因为namevname 不包含字符串。通过为它们中的每一个指定大小为 4,并使用 4 个字符的字符串作为初始值设定项,您已经告诉编译器只存储这 4 个字符而没有标记字符串的结尾。

    行为未定义;你很幸运,它没有崩溃。

    删除4(或将其更改为5):

    char name[] = "sara";
    char vname[] = "sara";
    

    编辑:这是您的程序的修改版本,它修复了其他几个问题(请参阅 cmets)。除了在 namevname 的声明中省略 4 之外,大多数更改与您的问题没有直接关系。

    #include <stdio.h>  /* needed for printf */
    #include <string.h> /* needed for strcmp */
    
    int main(void) /* correct declaration of "main" */
    {
    
        char name[] = "sara";   /* omit 4 */
        char vname[] = "sara";  /* omit 4 */
    
        if (strcmp(name, vname) == 0)
        {
            printf("OK\n");     /* \n is at the *end* of the line */
        }
        else
        {
            printf("Error\n");  /* as above */
        }
    
        return 0; /* not absolutely required, but good style */
    }
    

    【讨论】:

      【解决方案4】:

      这是因为你没有为你的字符串分配足够的空间(4个字节可以存储“sara”的字符,但不能存储字符串末尾的nul字符。

      strcmp 遍历字符串,直到它到达一个 nul 字符,或者字符串中的一个差异,然后,如果它达到两个字符串的 nul,它们是相等的。由于您没有为 nul 字符分配足够大的数组,因此最终会导致两个字符串不相等。事实上,在大多数系统中,您可能会得到类似于“sarasara”的名称,而 vname 只是“sara”,因为 vname 紧跟在 name 之后,很有可能它将它们存储在内存中并覆盖名称 nul char。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        相关资源
        最近更新 更多