为何scanf("%c", &ch)无法读取控制台字符,而scanf(" %c", &ch)可以?
为什么
scanf("%c", &ch)读不到字符,加个空格却可以? 这问题我刚学C的时候踩过好多次坑!核心原因就是**输入缓冲区里残留的空白字符(大多是换行符\n)**在捣乱,下面给你掰扯清楚:
1. 不带空格的%c为啥会“失灵”?
scanf("%c", &ch)的规则很直白:它会直接读取输入缓冲区里的第一个字符,不管这个字符是字母、数字,还是换行、空格这种空白符。
举个常见场景:如果你的代码之前用过其他输入(比如scanf("%d", &num)),用户输入数字后会按回车确认,这时候回车产生的\n会留在输入缓冲区里。当你接着调用scanf("%c", &ch)时,它不会等你输入新字符,直接就把这个残留的\n读进ch里了,自然就不是你想要的Y/N。
哪怕是第一次输入,比如你的代码里:
printf("If the value of speed of sound is known enter Y else enter N"); scanf("%c", &ch);
如果用户输入Y后按回车,这时候缓冲区里的Y被读走,但\n还留在里面——要是之后再调用一次scanf("%c", &ch),第二次就会直接读这个换行符。
2. 加个空格的" %c"为啥能正常工作?
这里的空格是关键!在scanf的格式字符串里,任何空白字符(空格、换行、制表符)都会告诉scanf:先跳过输入缓冲区里所有的空白字符,直到遇到第一个非空白字符再读取。
所以scanf(" %c", &ch)会先把缓冲区里残留的\n(或者其他空格、制表符)全部跳过,然后再等待用户输入Y/N,这时候读到的就是你真正想要输入的字符了。
一句话总结
%c会读取缓冲区里的第一个字符,不管是不是空白;%c前加空白(比如空格),会先跳过所有空白,再读取有效字符。
内容的提问来源于stack exchange,提问作者Vivek Singh
相关产品推荐
相关产品推荐

