我正在尝试通过输入到标准输入的字符串选择性地过滤文本文件.
我想知道为什么以下代码不起作用以及如何解决它:
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);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码试图获取一个文本文件,打开该文件,然后逐行读取文件,并为执行该strstr()函数的每一行以文件的当前行作为参数1作为字符串,并给出给定的名称城市作为参数2作为字符串.
然而,我得到的结果是打印文件的整个内容(最后一行打印两次,虽然这是一个单独的问题,我知道这部分的修复).
我正在阅读的C书说明该strstr()函数用于在"haystack"字符串中查找"needle"字符串,因此它是C++ substr()函数的C等价物.
strstr() 将参数1作为干草堆,将参数2作为针.
我首先从标准输入读入到针中,然后逐行检查是否strstr()返回NULL(如果在haystack中找不到针,它应该返回NULL)并且如果它返回NULL之外的其他东西,则意味着它找到字符串中的子字符串,它应该只打印行THEN.
而是打印文件中的所有行.为什么?
如果我将其切换为f(strstr(line, stringToFind))相反,那么它绝对不打印.
为什么?