当字符串相等时,strcmp会导致false

时间:2012-11-14 13:56:18

标签: c

这是我的代码:

        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, ",");
    }

2 个答案:

答案 0 :(得分:9)

好吧,如果它是

char pch[64];

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

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

答案 1 :(得分:5)

如果你的一个或两个数组的确切大小为64,那么你将错过最后一个'\ 0'结尾的字符串。