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