所以我尝试过广泛地搜索这个解决方案,但是只能找到其中一个字符串中缺少新行或空字节的帖子。我很确定这不是这种情况。
我使用以下函数将一个单词与一个文件进行比较,该文件包含每行一个单词的单词列表(函数中的字典)。这是代码:
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
有什么想法吗?我觉得我必须遗漏一些显而易见但却无法在搜索中找到任何内容的东西。
答案 0 :(得分:5)
我看到您在测试字符串中附加newline
以尝试处理fgets()
保留行结尾的问题。从源头上解决这个问题要好得多。你可以在阅读文件后立即删除所有这样的尾随。
readValue [ strcspn(readValue, "\r\n") ] = '\0'; // remove trailing newline etc
答案 1 :(得分:4)
您正在阅读的字符串包含尾随字符,因此与您要比较的字符串不同。
删除尾随换行符(如果有,则删除CR);那么你不需要在被比较的字符串中添加任何换行符或回车符:
int isWord(char *word, char *dictionary){
FILE *fp;
fp = fopen(dictionary, "r");
if (fp == NULL){
fprintf(stderr, "error: dictionary cannot be opened\n");
return 0;
}
if (strlen(word) > 16){
fprintf(stderr, "error: word cannot be >16 characters\n");
return 0;
}
char readValue[50];
while (fgets(readValue, 50, fp) != NULL){
char *ep = &readValue[strlen(readValue)-1];
while (*ep == '\n' || *ep == '\r'){
*ep-- = '\0';
}
if (strcmp(readValue, word) == 0){
return 1;
}
}
return 0;
}