0

这是我的代码:

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

pch从文件中读取,map[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, ",");
    }
4

2 回答 2

9

好吧,如果是

char pch[64];

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

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

于 2012-11-14T13:58:54.530 回答
5

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

于 2012-11-14T13:58:42.457 回答