不使用fgets实现多文件行号打印,如何去除末尾多余行号
问题原因
你代码的问题核心是行号打印逻辑提前了:每次遇到换行符就立刻打印下一行的行号,无论后续有没有实际的行内容。如果输入文件最后一行末尾自带换行符,输出完最后一行的换行后,多余的行号就会被打印出来,出现在终端提示符前面。
另外你现有代码里的无参数读取标准输入的逻辑有问题:argc<2时for循环不会执行,永远走不到读取stdin的分支。
修复后代码
#include <stdio.h> int main(int argc, char *argv[]) { FILE *fp; int c, n = 1; // 新增标记:标识下一个字符是新行的开头 int new_line = 1; int i; // 无参数时读取标准输入 if (argc < 2) { fp = stdin; while ((c = getc(fp)) != EOF) { if (new_line) { printf("%d ", n); new_line = 0; } putc(c, stdout); if (c == '\n') { n++; new_line = 1; } } return 0; } // 有参数时遍历处理每个文件 for (i = 1; i < argc; i++) { fp = fopen(argv[i], "r"); if (fp == NULL) { perror(argv[i]); continue; } while ((c = getc(fp)) != EOF) { if (new_line) { printf("%d ", n); new_line = 0; } putc(c, stdout); if (c == '\n') { n++; new_line = 1; } } fclose(fp); } return 0; }
改动说明
- 新增
new_line状态标记:只有确认下一个字符是新行的第一个有效字符时,才打印对应行号,避免文件末尾无内容时多余打印行号 - 修复无参数逻辑:把
argc<2的判断移到for循环外,确保没有传入文件路径时可以正常读取标准输入内容 - 新增
fopen失败的错误提示,避免访问空指针崩溃
内容的提问来源于stack exchange,提问作者dreamingsoftwareegineer
相关产品推荐
相关产品推荐

