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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:15:53