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
相关产品推荐
相关产品推荐

