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

C语言中fgets未调用时程序提前等待输入的原因

问题根源

问题出在scanf("%d\n", &number);格式字符串末尾的\n上。
scanf()对格式串中空白字符(空格、\n、\t都属于空白字符)的匹配逻辑是:匹配输入流中连续任意数量的空白字符,直到遇到第一个非空白字符才会终止匹配,不会只匹配单个换行。
实际执行流程和你遇到的现象完全对应:

  1. 你输入10敲回车后,%d顺利读走整数10,接下来格式串里的\n开始工作:它先吃掉你敲的回车换行,发现后面没有非空白字符,就会一直阻塞等待更多输入,直到你输入下一个非空白内容(也就是你原本要给fgets输入的字符串开头的a),scanf才会执行结束。
  2. 等scanf返回时,输入缓冲区里已经留着你刚输入的a string内容,后续fgets执行时不会再等待新输入,直接把缓冲区里现存的内容读走,就出现了“还没调用fgets就开始等输入、fgets执行时不卡顿直接读走内容”的异常表现。
修复方法
  1. 首先删掉scanf格式串末尾多余的\n,把读取整数的语句改成scanf("%d", &number);
  2. 注意:scanf("%d")只读走整数数字部分,你输入完整数敲的回车会残留在输入缓冲区,如果直接调用fgets,会直接读到这个空换行、拿到空字符串,所以需要在scanf之后加一段逻辑,清空整数后残留的缓冲区内容。

修正后的完整代码:

#include <stdio.h>

int main()
{
    int number;
    char string[32];
    int c;

    printf("Input the number.\n> ");
    scanf("%d", &number);
    // 清空输入缓冲区中整数后面残留的所有字符直到换行
    while ((c = getchar()) != '\n' && c != EOF);

    printf("\nInput the string.\n> ");
    fgets(string, 32, stdin);

    printf("\nnumber: %d\nstring: %s\n", number, string);
    return 0;
}

补充提示:如果后续要混用scanf和逐行读取函数(比如fgets),一定要注意scanf不会自动消耗输入末尾的换行,残留的换行很容易导致后续读取逻辑出错,最稳妥的方式是每次scanf读取完格式化内容后,主动清空行尾残留的输入内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:45:36