You need to enable JavaScript to run this app. C语言连续两次调用fgets()时第二次不等待输入是什么原因?
优惠活动
大模型
产品
解决方案
定价
更多

C语言连续两次调用fgets()时第二次不等待输入是什么原因?

问题原因
  • 核心是stdin输入缓冲区存在残留的未读字符,第二次fgets直接读取了残留内容,不会触发等待用户输入的逻辑。
  • fgets的规则是:接收3个参数分别为存储缓冲区、最大读取长度、输入流,它最多读取最大长度-1个字符,遇到换行符\n或EOF就停止读取,且会把读到的\n也存入缓冲区末尾,最后补\0作为字符串结束标记。
  • 你的测试代码中第一个fgets第二个参数传了3,意味着最多只读取2个有效字符存入数组。如果你第一次输入时:
    • 输入了≥2个字符+回车:第一个fgets只会取前2个字符,输入缓冲区会剩下后面的字符+\n
    • 输入了1个字符+回车:fgets会把字符和\n都读走,这种场景下第二个fgets才会等待输入,你遇到的跳过问题属于第一种场景,和数组本身长度是3还是4没有关系。
修复方案

每次调用完fgets后,手动清空stdin缓冲区的残留内容,添加如下逻辑即可:

int c;
while ((c = getchar()) != '\n' && c != EOF);
修复后的完整测试代码
#include <stdio.h>

int main(void)
{
    char I[4];
    
    fgets(I, 3, stdin);
    printf("%s", I);
    
    // 清空残留的输入缓冲区
    int c;
    while ((c = getchar()) != '\n' && c != EOF);
    
    fgets(I, 3, stdin);
    printf("%s", I);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 19:06:03