C如何在文件中搜索字符串?

时间:2018-11-20 21:27:31

标签: c file string-comparison

我的代码有问题,我正在尝试搜索文件中的字符串,我可以读取它,但是,当我比较两个字符串时,它仅将文件的最后一个与第一个字符串相等用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);
}

1 个答案:

答案 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;
}