如何实现类似cat -s命令将连续空行合并为单个空行的功能
实现方法
要达到和cat -s命令完全一致的连续多空行合并为单个空行的效果,不需要复杂的行缓存,只需要加一个状态位跟踪连续空行状态即可,逻辑非常轻量:
- 定义一个标记位记录当前是否已经输出过连续空行段的换行,初始状态为未输出
- 逐字符遍历文件内容:
- 读到非换行字符时,说明当前行不是空行,清空空行标记,直接输出字符
- 读到换行符时,如果还没输出过当前空行段的换行,就输出这个换行并打上标记;如果已经打过标记,说明这是连续多余空行的换行,直接跳过不输出
- 额外补充原代码缺失的文件打开失败判断,避免空指针触发崩溃
完整修改后代码
#include <stdio.h> #include <stdlib.h> int main() { int c; // 空行状态标记:0=当前未处于待跳过的连续空行段,1=已输出过当前空行段的换行 int in_blank = 0; FILE *file = fopen("2.txt", "r"); if (file == NULL) { perror("打开文件失败"); return EXIT_FAILURE; } while ((c = getc(file)) != EOF) { if (c != '\n') { in_blank = 0; putc(c, stdout); } else { if (!in_blank) { in_blank = 1; putc(c, stdout); } } } fclose(file); return 0; }
效果说明
- 无连续空行的普通文本输出和原文件完全一致
- 文件开头、段落之间的任意数量连续空行都会被压缩为单个空行
- 逐字符处理的逻辑内存占用恒定,不受文件大小影响,行为和原生
cat -s完全对齐
内容的提问来源于stack exchange,提问作者Марифат Гадиров
相关产品推荐
相关产品推荐

