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
相关产品推荐
相关产品推荐

