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

C语言文件复制去相邻重复字符代码异常问题排查

问题分析

你的代码逻辑存在几个关键问题,导致输出异常:

  • 丢失首字符:代码直接跳过了第一个读取的字符c,只在c != d时写入d,完全没处理第一个字符。
  • 错误处理EOF:当读取d时可能已经到达文件末尾(EOF),此时你仍尝试将d(即EOF)写入文件,这会产生乱码(比如ÿ)。
  • 逐双读取逻辑错误:这种每次读两个字符的方式,会导致奇数长度的文本最后一个字符被丢弃,同时无法处理连续重复超过两个的情况(比如yyyyyyyyyyyy)。
修正后的代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int remove_doubles(const char* filein, const char* fileout) {
    if (!filein || !fileout) {
        return 0;
    }
    FILE* f = fopen(filein, "r");
    if (f == NULL) {
        return 0;
    }
    FILE* g = fopen(fileout, "w");
    if (g == NULL) {
        fclose(f); // 打开输出文件失败时,关闭已打开的输入文件避免资源泄漏
        return 0;
    }

    int prev_char = fgetc(f);
    if (prev_char != EOF) {
        fprintf(g, "%c", prev_char); // 先写入第一个字符
        int curr_char;
        while ((curr_char = fgetc(f)) != EOF) {
            if (curr_char != prev_char) {
                fprintf(g, "%c", curr_char);
                prev_char = curr_char; // 更新前一个字符为当前字符
            }
        }
    }

    fclose(f);
    fclose(g);
    return 1;
}

int main(void) {
    char filein[] = "test.txt";
    char fileout[] = "out_test.txt";
    int result = remove_doubles(filein, fileout);

    return 0;
}
修正说明
  • 保留首字符:先读取第一个字符,若不是EOF则直接写入输出文件。
  • 逐个字符遍历:从第二个字符开始,每次读取当前字符并和前一个字符比较,不同则写入并更新前一个字符,完美处理任意长度的连续重复。
  • 资源安全:打开输出文件失败时,关闭已打开的输入文件,避免资源泄漏。
  • 正确处理EOF:只有读取到的字符不是EOF时才进行处理,不会把EOF写入文件产生乱码。

测试输入hello, world! heyyyyyyyyyyyy worlllllddddddd,输出会是helo, world! helo wrld,完全符合去除相邻重复字符的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:30:47