C语言实现TXT文件字符串查找及出现次数统计的问题求助
问题排查与修复方案
先梳理原代码里的核心问题:
- scanf格式错误:
scanf("%[^\n]s", str);多了后缀s,应改为scanf("%[^\n]", str);,且读取后要处理缓冲区残留的换行符,否则会干扰后续操作。 - 函数名拼写错误:
fscan是笔误,正确函数是fscanf。 - strstr参数逻辑完全错误:
strstr的用法是strstr(被搜索的字符串, 要查找的子串),你不仅写反了参数,还错误用%s作为被搜索对象,完全不符合函数逻辑。 - 提前关闭输出文件:原代码打开
out_file后立刻执行fclose(out_file),导致后续无法写入统计结果,这是致命错误。 - 错误往输入文件写入内容:
fprintf(in_file, ...)是往只读打开的输入文件写操作,完全错误,应写入out_file。 - 统计逻辑缺陷:用
fscanf("%s", ...)只能按空格分割单词统计,无法处理带空格的短语,且没考虑一行中多次出现目标字符串的情况。 - 变量覆盖问题:用户输入的目标字符串存在
str里,之后用fscanf把文件内容读进str,会直接覆盖目标字符串,导致后续查找完全失效,需额外缓冲区存储文件读取内容。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char const *argv[]) { int num = 0; char target[300]; // 存储用户输入的目标字符串 char buffer[1024]; // 存储从文件读取的每行内容 printf("Enter a Sentence or Phrase: "); // 修正scanf格式,读取带空格的字符串,处理换行符 scanf("%[^\n]", target); getchar(); // 吃掉缓冲区里的换行符 printf("This is What you entered: %s\n", target); // 打开文件,保持out_file打开直到写入完成 FILE *in_file = fopen("text.txt", "r"); FILE *out_file = fopen("result.txt", "w"); if (in_file == NULL || out_file == NULL) { printf("Error! Could not open file\n"); exit(-1); } // 逐行读取文件内容,处理每行中多次出现目标字符串的情况 while (fgets(buffer, sizeof(buffer), in_file) != NULL) { char *pos = buffer; // 在当前行中循环查找目标字符串,直到找不到为止 while ((pos = strstr(pos, target)) != NULL) { num++; pos += strlen(target); // 移动指针,避免重复统计同一个位置 } } // 写入统计结果到输出文件 fprintf(out_file, "We found the phrase \"%s\" in the file %d times\n", target, num); // 打印到控制台方便查看 printf("We found the phrase \"%s\" in the file %d times\n", target, num); // 最后关闭文件 fclose(in_file); fclose(out_file); return 0; }
关键修复说明
- 拆分变量:用
target存储用户输入的目标字符串,buffer存储文件读取的内容,避免变量覆盖问题。 - 逐行读取+循环查找:用
fgets逐行读取文件,在每行内用strstr循环查找,确保统计到一行中多次出现的目标字符串。 - 修正文件操作逻辑:保持
out_file打开直到写完结果,再关闭;仅往输出文件写入内容,输入文件保持只读状态。 - 修复scanf问题:去掉多余的
s,并处理换行符,避免后续输入异常。 - 规范返回值判断:用
strstr(...) != NULL判断是否找到子串,代码可读性更强。
内容的提问来源于stack exchange,提问作者Dylan de Hoyos
相关产品推荐
相关产品推荐

