我已经尝试过广泛搜索解决此问题,但只能找到其中一个字符串缺少换行符或空字节的帖子。我相当确定这里不是这种情况。
我正在使用以下函数将一个单词与包含每行一个单词的单词列表文件(函数中的字典)进行比较。这是代码:
int isWord(char * word,char * dictionary){
FILE *fp;
fp = fopen(dictionary,"r");
if(fp == NULL){
printf("error: dictionary cannot be opened\n");
return 0;
}
if(strlen(word)>17){
printf("error: word cannot be >16 characters\n");
return 0;
}
char longWord[18];
strcpy(longWord,word);
strcat(longWord,"\n");
char readValue[50] = "a\n";
while (fgets(readValue,50,fp) != NULL && strcmp(readValue,longWord) != 0){
printf("r:%sw:%s%d\n",readValue,longWord,strcmp(longWord,readValue));//this line is in for debugging
}
if(strcmp(readValue,longWord) == 0){
return 1;
}
else{
return 0;
}
}
代码编译无误,函数可以正确读取字典文件并打印出其中的单词列表。然而,我的问题在于,即使两个字符串完全相同,strcmp 也不会返回0,因此该函数对任何输入都会返回false。
例如,我得到的结果是:
r:zymoscope
w:zymoscope
-3
有什么想法吗?我觉得我一定是漏看了什么显而易见的东西,但在搜索中找不到任何信息。
printf()
函数打印所有数据,但在格式字符串中没有包含\n
。你依赖于数据中的换行符,这似乎有些可疑。(编写一个函数以十六进制形式打印字符串中的字节;在每个字符串上调用它;发现区别所在。) - Jonathan Lefflerfgets(readValue,50,fp)
后立即使用readValue[strcspn(readValue, "\r\n")] = 0;
来消除行尾字符。 - chux - Reinstate Monicastatic void dump_string(const char *tag, const char *string) { size_t len = strlen(string); printf("%s (%zu):", tag, len); size_t i; for (i = 0; i < len; i++) { printf(" %.2X", (unsigned char)string[i]); if (i % 16 == 15) putchar('\n'); } if (i % 16 != 0) putchar('\n'); }
并调用它:dump_string("r", readValue); dump_string("w", longWord);
或类似的方式。 - Jonathan Lefflerprintf("'%s'\n", bad_string);
的方式来帮助识别前导和尾随的空格、换行符等。2)与其认为strcmp()
是错误的,不如问问为什么这些字符串不相等。 - chux - Reinstate Monica