【发布时间】: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)),则它绝对不会打印任何内容。
为什么?
【问题讨论】: