繁体   English   中英

为什么比较C中的字符串不起作用?

[英]Why comparing strings in C doesn't work?

我有以下程序

main()
{

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

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

}

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

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

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

请原谅我,如果这是偏离轨道,因为我已经很久没有做过C!

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

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

你已经为char数组指定了硬盘长度,但是在C中,字符串是空终止的,所以“sara”实际上需要len 5而不是4。

因为namevname不包含字符串。 通过为每个字符串指定4的大小,使用4个字符的字符串作为初始化程序,您已告诉编译器只存储那4个字符而没有标记字符串结尾的'\\0' 0'null字符。

行为未定义; 你是(不)幸运的,它不仅仅是崩溃。

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

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

编辑 :这是您的程序的修改版本,修复了其他几个问题(请参阅注释)。 其他省略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个字节可以存储“sara”的字符,但不能存储字符串末尾的nul字符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM