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

为什么if语句内调用fgets函数无法正常读取用户输入?

问题根源

该问题由标准输入缓冲区的残留换行符导致:

  • 调用scanf_s("%d", &menu_num)读取菜单数字时,仅会提取输入内容中的数字部分,用户按下回车生成的\n换行符会残留在stdin输入缓冲区中
  • 后续执行fgets操作时,会直接读取到缓冲区中残留的换行符,判定为已经完成一行输入,因此不会等待用户输入新内容,直接返回菜单界面。

修复方案

在scanf_s读取菜单数字完成后、执行fgets操作前,清空输入缓冲区的残留内容即可,参考修复代码如下:

int main() {
    while (1) {
        printf("The following options are available \n"
            "Read in data [1] \n"
            "Print out catalogue to screen [2] \n"
            "Save data to file [3] \n"
            "Exit Program [4] \n"
            "Enter your choice now ");
        scanf_s("%d", &menu_num);
        // 新增代码:清空输入缓冲区残留的换行及其他冗余字符
        int c;
        while ((c = getchar()) != '\n' && c != EOF);
        if (menu_num == 1) {
            printf("Name of band of Singer: ");
            fgets(hold[0].singer, 20, stdin); 
        }
        // 原有其他逻辑
    }
}

如果你的场景能确保缓冲区仅残留单个换行符,也可以简化为while(getchar()!='\n');。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:39:01