c语言:scanf(" %c",&bla); scanf("%c",&bla); 语句差别
%前有空格,%没有空格
scanf("%c",&c) 与 scanf(" %c",&c),后者只是在%前多了个空格,似乎没有什么区别,但使用起来区别是很大的。
scanf()作单字符输入时规定只接收一个字符,但它却把回车符也作为字符对待的。这个回车符是放在缓冲区的,但是空格却是直接忽略掉。
这就造成程序中第二次调用scanf("%c",&c)是从缓冲区中取一个字符,把第一次调用scanf("%c",&c)后输入的回车当作输入字符了。
这就在输入逻辑上造成了混乱。
有了scanf(" %c",&c)这个空格(换成\n或者\t也可以),这样就把缓冲区中的回车当成第一个字符,读取后丢掉。
#include <stdio.h> int main() { char bla,blb; scanf("%c",&bla); scanf("%c",&blb); printf("%c %c\n",bla,blb); bla=bla+32; blb=blb+32; printf("%c %c\n",bla,blb); getchar(); }
本次运行输入U Y结果如左图,本来应该显示: u y
本次运行输入T R结果如左图, 本来应该显示:t r
但每次结果都是*
分析原因:*(ASCII:42) 每输入U Y T R时都回车,末尾都有换行,换行符(ASCII:10), 10+32=42,对应的字符是*
主要是输入 第一个字符后回车换行,存入键盘缓冲区,第二次使用scanf()时直接使用了换行符,根据换行符进行了计算,所以每次都出现*
解决方法:将“与%加个空格
#include <stdio.h> int main() { char bla,blb; scanf(" %c",&bla); scanf(" %c",&blb); printf("%c %c\n",bla,blb); bla=bla+32; blb=blb+32; printf("%c %c\n",bla,blb); getchar(); }
scanf(" %c\n",&bla);该语句一定不能添加\n,否则不能完成输入