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

C语言调用scanf后fgets未执行无输入提示的原因及解决方法

问题产生原因

你的代码存在两个导致该现象的问题:

  1. 输入缓冲区残留问题:scanf("%d", &num)执行时仅读取整数部分,用户输入结束按下的换行符\n会残留在标准输入缓冲区中。后续调用fgets时,会优先读取缓冲区中已存在的换行符,直接将其作为输入内容存入answer数组,无需等待用户手动输入。
  2. fgets读取内容格式问题:fgets读取用户输入时,会将输入末尾的换行符一并存入目标数组,因此即使用户正常输入yes,answer的实际内容是yes\n,和你预设的yes字符串比较结果也不为0,循环无法正常进入下一轮。
可行解决方法
  • 方法1:清空输入缓冲区并处理fgets读入的换行符
    在scanf("%d", &num);后添加代码清空残留内容,再在fgets读取后去掉末尾的换行符:
    // scanf后添加,清空缓冲区残留
    while (getchar() != '\n');
    // fgets读取后添加,去掉末尾换行符
    answer[strcspn(answer, "\n")] = '\0';
    
  • 方法2:使用带空白前缀的scanf读取确认信息
    把fgets调用替换为scanf(" %s", answer);,格式字符串开头的空格会自动跳过所有前置空白字符(包括残留的换行符),且%s不会读入换行符,无需额外处理字符串即可直接和yes比较。
  • 方法3:统一使用fgets处理所有输入
    避免混合使用scanf和fgets,整数输入也用fgets读取后再通过strtol/atoi转换成整型,从根源上避免缓冲区残留问题,同样需要处理读入字符串的末尾换行符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 07:36:03