C语言开发带命令行标志工具时switch分支行尾输出$失效问题
switch改写版本的错误点
- 分支匹配值错误:
case 'e'匹配的是小写字符e,并非需要处理的换行符'\n'。进入该分支时ch的值固定为'e',内部嵌套的if (ch == '\n')判断永远为假,换行处理逻辑完全不会执行。 - 缺失普通字符处理逻辑:原代码中所有非换行字符需要直接打印输出,改写版本没有对应分支,读取到普通字符后无任何输出。
- 文件关闭位置错误:
fclose(fp)被写在while循环内部,第一次读取字符后就会关闭文件句柄,后续读取操作直接失败,无法遍历完整文件。 - 缺失初始行号输出:按照原逻辑的行号打印位置,第一行开头需要先输出初始行号
1.,改写版本遗漏了这一步。 - 补充说明:改写版把
ch定义为int类型是正确的,getc()返回值是int类型,原第一版用char存储返回值,在无符号char的系统上会导致EOF判断失效。
修正后可运行代码
#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { (void)argc; int count = 1; int ch; FILE *fp; if((fp=fopen(argv[1], "r"))==NULL) { printf("Can't open file.\n"); exit(1); } // 输出第一行初始行号 printf("%d.", count); while((ch=getc(fp))!=EOF) { switch (ch) { case '\n': // 遇到换行先打行尾$,再输出下一行行号 printf("$\n%d.", count); count++; break; default: // 非换行字符直接输出 putchar(ch); break; } } // 补全原代码遗漏的最后一行行尾$标记 printf("$\n"); // 所有内容读取完成后再关闭文件 fclose(fp); return 0; }
注:修正版额外补全了原第一版代码的两个小缺陷:一是修复了文件最后一行不以换行符结尾时,行尾不会打印$的问题;二是保留了ch为int类型的正确写法,避免EOF判断异常。
内容的提问来源于stack exchange,提问作者strawberryry
相关产品推荐
相关产品推荐

