繁体   English   中英

当字符串相等时,strcmp结果为false

[英]strcmp results in false when strings are equal

这是我的代码:

        if(strcmp(pch,map[i].name)==0){
            printf("Equal\n");
            return 0;
        }

从文件中读取pchmap[i].name的已知大小为64。这对于小于64的字符串非常有用。当比较以下两个大小小于63的字符串时:

file11111111111111111111111111111111111111111111111111111111111

file11111111111111111111111111111111111111111111111111111111111

一切都是桃红色的,并且预期的结果是相等的,但是当比较这两个(大小为64)时:

file111111111111111111111111111111111111111111111111111111111111

file111111111111111111111111111111111111111111111111111111111111

返回是错误的。 我想到了:

        if(strncmp(pch,map[i].name,64)==0){
            printf("Equal\n");
            return 0;
        }

它确实适用于确切大小为64的字符串,但对于较小的字符串,结果是随机的。 我在这里处理什么样的古怪行为?

编辑:这是完整的代码:

    char * pch;
    char tempFilesNeeded[100*64+100];
    strcpy(tempFilesNeeded,map[i].filesNeeded);
    pch = strtok(tempFilesNeeded,",");
    while (pch != NULL)
    {
        if(strcmp(pch,map[i].name)==0){
            printf("Equal\n");
            return 0;
        }

        pch = strtok (NULL, ",");
    }

好吧,如果是

char pch[64];

那么您就不能在那里有64个可见字符,因为终止需要最后一个条目。 如果该数组中确实有"file111111111111111111111111111111111111111111111111111111111111" ,则它不会终止,并且在其上调用strcmp()会调用未定义的行为。

另外,作为次要点,说strcmp()返回“ false”是错误的,因为它的返回值不是布尔值。 它返回前两个不同字符之间的关系; 如果没有字符不同,则字符串相等,则返回零。

如果一个或两个数组的确切大小为64,则您将缺少最后一个'\\ 0'字符串结尾。

暂无
暂无

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

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