【问题标题】:Finding a substring of a string in a file C在文件 C 中查找字符串的子字符串
【发布时间】:2015-10-26 20:02:59
【问题描述】:

我正在尝试通过输入到标准输入的字符串选择性地过滤文本文件。

我想知道为什么下面的代码不起作用以及如何解决它:

void get_filtered_list() {
    FILE *f;
    f = fopen("presentlist.txt", "r"); 
    printf("Enter the city by which you want to select lines:\n");
    char stringToFind[20]; 
    fgets(stringToFind, sizeof(stringToFind), stdin);
    char line[160];
    while (!feof(f)) {
        fgets(line, sizeof(line), f); 
        if (strstr(line, stringToFind) != NULL) {
            printf("%s", line);
        }
    }
    fclose(f);
}

上面的代码试图获取一个文本文件,打开该文件,然后逐行读取文件,并且对于执行strstr()函数的每一行,文件的当前行作为参数1作为字符串,以及城市的给定名称作为参数 2 作为字符串。

但是,我得到的结果是打印文件的全部内容(最后一行打印了两次,尽管这是一个单独的问题,我知道这部分的修复方法)。

我正在阅读的 C 书指出,strstr() 函数用于在 haystack 字符串中查找 needle 字符串,因此它是 C 中的C++substr()函数。

strstr() 将参数 1 视为大海捞针,将参数 2 视为针。

我首先从标准输入读入针,然后逐行检查strstr()是否返回NULL(如果在大海捞针中找不到针,它应该返回NULL),如果它返回除NULL 之外的其他内容,这意味着它在字符串中找到了子字符串,它应该只打印 THEN 行。

而是打印文件中的所有行。为什么?

如果我将其切换为 f(strstr(line, stringToFind)),则它绝对不会打印任何内容。

为什么?

【问题讨论】:

  • 我不知道您为什么将strstrsubstr 进行比较。更像是find

标签: c string


【解决方案1】:

您没有找到该字符串,因为您没有从fgets 读取到stringToFind 的字符串中去除尾随'\n'。实际上,当且仅当它是一行中的最后一个单词时,您才会找到该字符串。

您可以使用以下命令删除换行:

#include <string.h>

stringToFind[strcspn(stringToFind, "\n")] = '\0';

还有其他方法可以去除换行符,但请注意,如果文件的最后一行没有以换行符结尾,则fgets 填充的缓冲区中不会有一个,因此您不能只覆盖行的最后一个字符。对于您的问题,最好删除 stringToFind 开头和结尾的所有空白字符。

同时检查这个问题:Why is “while ( !feof (file) )” always wrong?

使用while (!feof(f)) 测试文件结尾将太晚捕获文件结尾:fgets 将失败并且您不测试其返回值,因此文件的最后一行似乎被处理了两次。编写这个循环的正确方法是这样的:

while (fgets(line, sizeof(line), f)) {
    if (strstr(line, stringToFind) != NULL) {
        printf("%s", line);
    }
}

也不是超过159字符的行会被fgets分割,如果它们包含搜索到的字符串会导致错误的输出,特别是如果字符串本身被分割。

【讨论】:

  • 是的,我发现如果我输入最后一个单词就可以了。但为什么??以及如何删除换行符?我只是从 fgets 长度中减去 -1 吗?
  • @user1966576 strtok(line, "\n") 就足够了。请注意,如果 line 只有 '\n' 字符,这将不起作用。
  • @Petross404: strtok() 不建议精确地去除尾随换行符,因为它会在空行上失败。
猜你喜欢
  • 2013-06-01
  • 1970-01-01
  • 2015-06-10
  • 2012-11-10
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多