首先看下面的這個程序:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 int a,b,c; 6 printf("please input num a:\n"); 7 scanf("%d",&a); 8 printf("please input num b:\n"); 9 scanf("%d",&b); 10 printf("please input num c:\n"); 11 scanf("%d",&c); 12 printf("%d,%d,%d",a,b,c); 13 }
運行結果可想而知:
那麼把int改成char之後會是神馬結果呢?來看下一段代碼:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 char a,b,c; 6 printf("please input num a:\n"); 7 scanf("%c",&a); 8 printf("please input num b:\n"); 9 scanf("%c",&b); 10 printf("please input num c:\n"); 11 scanf("%c",&c); 12 printf("%c,%c,%c",a,b,c); 13 }
你能猜到運行結果是什麼嗎?
爲什麼會顯示這樣的結果?你猜到是什麼原因了嗎?
我們再來看一下源代碼:程序連續接收了三個字符,在C中enter鍵代表一個換行符,所以當輸入完a的值‘q’之後按下enter鍵,換行符立馬被字符b接收了,然後程序再向下走,輸入c的值‘w’。結果就會按順序顯示a,b,c的值,我們已經知道a='q',b='\n',c='w';所以結果就會顯示兩行。
如果我們加入getchar()會有什麼結果呢?
我們再來看一下改進的程序:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int main(void) 4 { 5 char a,b,c; 6 printf("please input num a:\n"); 7 scanf("%c",&a); 8 getchar(); 9 printf("please input num b:\n"); 10 scanf("%c",&b); 11 getchar(); 12 printf("please input num c:\n"); 13 scanf("%c",&c); 14 printf("%c,%c,%c",a,b,c); 15 }
顯示結果如下:
現在爲什麼會正常顯示我們想要的結果呢?原因就是getchar()把enter鍵所表示的字符接收了,所以就會達到想要的效果了。
到現在你應該明白爲什麼會出現這種情況了吧!無非就是輸入的規範問題,如果我們運行第二個程序,用另一種方法輸入看看會是神馬效果:
看到沒?也可以獲取想要的結果,但是程序並不是這麼美觀了,爲什麼會出現這種效果呢?
因爲編譯器規定輸入的時候並不是立即回顯,而是存到一個緩衝區裏面。當遇到換行字符會釋放緩衝區的數據,並清空緩衝區。
scanf()在讀取數字時會跳過空格、製表符和換行符!
http://www.cnblogs.com/ngnetboy/archive/2012/11/06/2756534.html