我的代码有问题,我正在尝试搜索文件中的字符串,我可以读取它,但是,当我比较两个字符串时,它仅将文件的最后一个与第一个字符串相等用scanf()
输入。
因此,想象一下我在文件中写了三个字,每个字都返回到该行。
test
test12
test123
例如,如果在我的scanf()
中写了test12
或在读时写了test
,它将对比较返回false(!== 0)。但是如果我写test123
会起作用,因为它是文件的最后一个字,但我不知道为什么?
char word[26];
char singleLine[26];
FILE *file = fopen("bin/Release/myWords.txt", "a+");
scanf("%26s", word);
if (file != NULL) {
while (!feof(file)) {
fgets(singleLine, 26, file);
compare = strcmp(singleLine, word);
if (compare == 0) {
printf("\n%s\n",word);
}
}
fclose(file);
}
答案 0 :(得分:1)
您的程序仅在非常特殊的情况下有效,并且有几个问题:
scanf("%26s", word);
可能会影响目标数组中最多27个字节,该目标数组的长度仅为26
。fopen("bin/Release/myWords.txt", "a+");
以追加模式打开文件:是否有必要?while (!feof(file))
总是错误的,您应该检查fgets()
的返回值,该值在文件末尾返回NULL
。compare = strcmp(singleLine, word);
仅比较完整行的精确数学,只有在单词有25个字符时才可能发生,否则singleLine
中的尾随换行符将导致比较失败。此外,虚线可能会导致意外结果,以及文件未以换行符结尾。fgets()
用确切的单词填充了缓冲区,而没有尾随的换行符。 / li>
strstr
搜索匹配项。这是修改后的版本:
#include <stdio.h>
#include <string.h>
int main() {
char word[27];
char singleLine[256];
FILE *file = fopen("bin/Release/myWords.txt", "r");
if (scanf("%26s", word) != 1)
return 1;
if (file != NULL) {
while (fgets(singleLine, sizeof singleLine, file)) {
singleLine[strcspn(singleLine, "\n")] = '\0'; // strip the newline if any
compare = strcmp(singleLine, word);
if (compare == 0) {
printf("\n%s\n", word);
}
}
fclose(file);
}
return 0;
}