当字符串相等时,strcmp会导致false
这是我的代码:
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, ","); }
好吧,如果是的话
char pch[64];
那么你不能有64个可见字符,因为终止需要最后一个条目。 如果你在该数组中有"file111111111111111111111111111111111111111111111111111111111111"
,它就不会终止,并且在它上面调用strcmp()
会调用未定义的行为。
另外,作为一个小问题,说strcmp()
返回“false”是错误的,因为它的返回不是 boolean。 它返回两个第一个不同字符之间的关系; 如果没有字符不同,字符串相等,则返回零。
如果您的一个或两个数组的确切大小为64,那么您将错过结束该字符串的最后一个’\ 0’。