You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键修复说明

  1. 拆分变量:用target存储用户输入的目标字符串,buffer存储文件读取的内容,避免变量覆盖问题。
  2. 逐行读取+循环查找:用fgets逐行读取文件,在每行内用strstr循环查找,确保统计到一行中多次出现的目标字符串。
  3. 修正文件操作逻辑:保持out_file打开直到写完结果,再关闭;仅往输出文件写入内容,输入文件保持只读状态。
  4. 修复scanf问题:去掉多余的s,并处理换行符,避免后续输入异常。
  5. 规范返回值判断:用strstr(...) != NULL判断是否找到子串,代码可读性更强。

内容的提问来源于stack exchange,提问作者Dylan de Hoyos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:55:43