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

C语言程序中fgets函数被跳过的问题求助

解决fgets被跳过无法获取文件名的问题

我一眼就看出问题出在哪了——你用getchar()读取操作选项后,输入缓冲区里还留着用户按下的换行符(\n),后面的fgets()会直接把这个换行符当成输入内容,所以看起来像是被跳过了。而且fflush(stdin)是C标准里的未定义行为,在很多编译器里根本不起作用,别再依赖它清缓冲区了!

给你两个靠谱的解决方案:

方案一:手动清除缓冲区残留的换行符

在读取完操作选项后,用循环把缓冲区里剩下的字符(包括换行符)全部吃掉,确保后续输入不受影响:

//之前的部分代码
printf("######################\n");
printf("# 1. 注册文件 #\n");
printf("# 2. 获取全局列表 #\n");
printf("# 3. 下载文件 #\n");
printf("# 4. 退出程序 #\n");
printf("######################\n");
printf("请输入选择:");
action = getchar();
action -= '0';

// 关键:清除缓冲区里的残留字符,直到遇到换行符
while (getchar() != '\n');

sprintf(input, "[%d]--", action);
switch (action) {
    case 1:
        printf("请输入文件名:");
        char filename[256];
        fgets(filename, sizeof(filename), stdin);
        // 可选:去掉fgets读取到的末尾换行符
        filename[strcspn(filename, "\n")] = '\0';
        // 后续处理文件名逻辑
        break;
    // 其他case分支...
}

用while循环而不是单次getchar,是为了处理用户输入数字后还输入其他字符的情况(比如输入1abc),确保缓冲区被彻底清空。

方案二:改用fgets读取操作选项(更稳妥)

彻底避开getchar的坑,直接用fgets读取整行输入,再把输入的字符串转换成数字:

//之前的部分代码
printf("######################\n");
printf("# 1. 注册文件 #\n");
printf("# 2. 获取全局列表 #\n");
printf("# 3. 下载文件 #\n");
printf("# 4. 退出程序 #\n");
printf("######################\n");
printf("请输入选择:");

char choice_buf[10];
fgets(choice_buf, sizeof(choice_buf), stdin);
// 把输入的字符串转换成整数操作码
action = atoi(choice_buf);

sprintf(input, "[%d]--", action);
switch (action) {
    case 1:
        printf("请输入文件名:");
        char filename[256];
        fgets(filename, sizeof(filename), stdin);
        filename[strcspn(filename, "\n")] = '\0';
        // 后续处理文件名逻辑
        break;
    // 其他case分支...
}

这种方式从根源上避免了缓冲区残留问题,而且能兼容用户的各种输入习惯。另外记得用strcspn()去掉fgets读取到的换行符,否则文件名末尾会带个多余的换行符。

内容的提问来源于stack exchange,提问作者Lithilion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:43:10