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

C语言如何替换文本文件中连续出现两次的指定字符

问题修正方案

现有代码核心问题

  • 基础语法错误:C标准库文件指针类型为FILE(首字母大写),fopen的打开模式参数是字符串,需要用双引号包裹"r+"
  • 读写指针逻辑错误:r+模式下读操作后文件指针会自动后移,直接执行fprintf会覆盖后续未读取的内容,且读写操作切换前必须调用fseek/fflush/rewind调整指针位置,否则属于未定义行为
  • 写入时机错误:每次匹配到连续e就写入当前行,会导致同一行被重复写入多次,正确逻辑是先替换完一行内所有符合规则的内容,再统一写入该行
  • 边界访问隐患:循环判断条件为line[i] != '\0',当i指向字符串最后一个有效字符时,访问line[i+1]会读取到结束符,虽然不会越界但属于无效判断,应该限制循环到strlen(line)-1位置

修正后代码

#include <stdio.h>
#include <string.h>

// 假设filename已经提前正确定义
int main() {
    const int maxChar = 101; // ASCII for 'e'
    const char replaceChar = '*';
    char line[200];
    // 存储处理后的所有行,大文件场景可改用临时文件中转方案
    char processed_lines[1000][200] = {0};
    int line_count = 0;
    int i;

    FILE *in_file = fopen(filename, "r+");
    if (in_file == NULL) {
        // 可自行补充文件打开失败的处理逻辑
        return 1;
    }

    // 第一步:读取所有行完成替换,暂存到内存
    while (fgets(line, sizeof(line), in_file) != NULL) {
        int len = strlen(line);
        for (i = 0; i < len - 1; i++) {
            if (line[i] == maxChar && line[i + 1] == maxChar) {
                line[i] = replaceChar;
                line[i + 1] = replaceChar;
                // 跳过已替换的下一个字符,避免重复匹配
                i++;
            }
        }
        strcpy(processed_lines[line_count], line);
        line_count++;
    }

    // 第二步:重置文件指针到起始位置
    rewind(in_file);

    // 第三步:将处理后的内容写回原文件
    for (i = 0; i < line_count; i++) {
        fprintf(in_file, "%s", processed_lines[i]);
    }

    // 截断文件,避免原文件长度大于处理后长度时残留旧内容
    ftruncate(fileno(in_file), ftell(in_file));

    fclose(in_file);
    return 0;
}

补充说明

如果处理的是大文件,内存放不下全部内容,可以改用临时文件中转方案:先读取原文件逐行处理写入临时文件,处理完成后删除原文件,将临时文件重命名为原文件名即可,该方案也兼容r+模式的使用要求。

内容的提问来源于stack exchange,提问作者williamclarke69

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:06:03