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

C语言中仅调用一次printf却重复打印的问题

问题

我羞于提出如此基础的问题,但这实在不合逻辑。为何程序中的提示语句会打印两次?我尝试添加sleep函数以排除回车键长按的影响,但问题依旧。需注意的是,该问题仅在第二次调用question函数及之后出现,这无疑是重要线索。

相关代码:

char question() {
    char response = ' ';
    while(response != '+' && response != '-' && response != '=') {
        printf("Respond with + or - or  = : ");
        scanf("%c", &response);
    }
    return response;
}
解答

问题根源在于输入缓冲区的残留字符:

  • 第一次调用函数时,你输入目标字符后按下回车键,scanf会读取你输入的字符,但回车键对应的换行符\n会留在输入缓冲区里。
  • 第二次调用question函数时,scanf("%c", &response)会直接读取缓冲区里的换行符,这个字符不满足循环终止条件,因此循环会再执行一次,提示语句就被重复打印了。

最稳妥的解决方法是修改scanf的格式字符串,在%c前添加一个空格:

scanf(" %c", &response);

这里的空格会让scanf自动跳过所有空白字符(包括换行、空格、制表符),直到读取到第一个非空白字符,彻底避免读取到残留的换行符。

也可以在每次scanf后调用getchar()手动吃掉换行符,但如果用户输入了多个额外字符(比如输入xy+再回车),残留的多余字符仍会留在缓冲区中,因此第一种方法适用性更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:05:10