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

Tom*_*Tom 0 c

这是我的代码:

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

pch从文件中读取,map[i].name已知大小为64.这适用于小于64的字符串.当比较大小为63的以下两个字符串时:

file11111111111111111111111111111111111111111111111111111111111

file11111111111111111111111111111111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

一切都是桃子,预期的结果是相同的,但是当比较这两个(大小为64)时:

file111111111111111111111111111111111111111111111111111111111111

file111111111111111111111111111111111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

回报是假的.我想到了:

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

它适用于精确大小为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, ",");
    }
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 9

好吧,如果是的话

char pch[64];
Run Code Online (Sandbox Code Playgroud)

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

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


Phi*_*Lho 5

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