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

调用fgets时printf输出后无法输入内容的技术问题求助

问题分析与解决办法

问题根源在于fflush(stdin)——C标准明确规定fflush仅对输出流或更新流(既读又写的流)有效,将其用于输入流stdin属于未定义行为,不同编译器的处理逻辑不一致,会直接导致后续fgets无法正常读取用户输入。

解决步骤

  • 移除fflush(stdin),替换为手动清空输入缓冲区的逻辑
  • 保留fgets以支持读取包含空格的完整字符串

修改后的代码

typedef struct
{
    char name[20];
}NAME_1;

static void ex6() {
    NAME_1 name;
    int c;
    // 手动清空输入缓冲区残留的字符
    while ((c = getchar()) != '\n' && c != EOF);
    
    printf("Name: ");
    fgets(name.name, 20 , stdin);
    // 去除fgets读取到的换行符(若存在)
    name.name[strcspn(name.name, "\n")] = '\0';
    printf("Name: %s\n", name.name);
}

额外说明

  1. 手动清空缓冲区的循环会读取输入流中所有残留字符(直到换行符或EOF),确保fgets能获取到用户新输入的内容
  2. strcspn函数会定位到换行符的位置,将其替换为字符串结束符\0,避免输出时多出空行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:29:51