【发布时间】:2015-10-18 01:56:31
【问题描述】:
因此,我已尝试广泛寻找解决方案,但只能真正找到其中一个字符串中缺少新行或空字节的帖子。我很确定这里不是这种情况。
我正在使用以下函数将单词与包含单词列表的文件进行比较,其中每行一个单词(函数中的字典)。代码如下:
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
有什么想法吗?我觉得我一定遗漏了一些明显的东西,但在我的搜索中找不到任何东西。
【问题讨论】:
-
我猜你是在一台 Windows 机器上,你已经阅读了带有 CRLF 行结尾的文件,并且你没有准确地去除结尾。在许多(大多数)代码集中,
'\r'和'\n'的值相差 3。奇怪的是,您有一个printf()打印所有这些数据,但格式字符串中没有\n。您依赖于数据中的换行符,这似乎有点可疑。 (编写一个函数以十六进制打印字符串中的字节;在每个字符串上调用它;找出差异。) -
另外,您的文件永远不会关闭。 在打开文件之前做所有可能的检查。完成后(或出现错误)关闭它。
-
在使用
fgets(readValue,50,fp)后建议readValue[strcspn(readValue, "\r\n")] = 0;消除行尾字符。 -
好的;在某些方面,这种情况(Linux 读取文件可能——可能——在 Windows 上创建)更有意义。为自己提供我建议的字符串转储功能并使用它。您可以使用:
static 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);或类似名称。 -
For future 1) 当打印麻烦的字符串时,使用
printf("'%s'\n", bad_string);来帮助识别前导和尾随空格、换行符等。 2) 不要认为strcmp()是错误的,问为什么字符串不相等。