今天再看getchar()函數,發現與scanf函數的知識混淆了,查找資料得出下面信息。
字符數據的輸入:
scanf()函數是格式輸入函數,即按用戶指定的格式從鍵盤上把數據輸入到指定的變量中。
在scanf()語句的格式串中由於沒有非格式字符在“%d%d%d”之間作為輸入時的間隔,因此在輸入時要用一個以上的空格或回車符作為每兩個輸入數之間的間隔。
scanf()在讀取數字時會跳過空格、制表符和換行符!
看下面的程序。
1 #include<stdio.h> 2 int main() 3 { 4 int a,b,c; 5 scanf("%d%d%d",&a,&b,&c); 6 printf("%d%d%d",a,b,c); 7 }
getchar()函數是鍵盤輸入函數,其功能是從鍵盤上輸入一個字符。簡單來說就是getchar()函數在C程序中的功能是接收一個字符。
首先看下面scanf()的程序:
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 }
運行結果:
再看下面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 }
運行結果:
為什麼會這樣子呢?為什麼到了num b的時候輸入不了呢?難道?
我們再來看一下源代碼:
程序連續接收了三個字符,在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 }
運行結果:
最後最後看下面的程序:
1 #include <stdio.h> 2 int main() 3 { 4 char a,b; 5 a=getchar(); 6 b=getchar(); 7 putchar(a); 8 putchar(b); 9 }
我們輸入x-回車-y-回車
結果會是xy嗎?不是的 結果是a=x b='\n'(回車)
當我們開始打x的時候,x在緩沖區,當我們按下回車的時候,第一個getchar()才獲取到x這個值 順利存到a裡 但回車既是確定又是字符,回車'\n'它也跟著進了緩沖區,並且和x一起被釋放,x到了程序裡 回車('\n')也到了程序裡,並且被第2個 getchar()獲取,此時我們輸入y,這時緩沖區裡有一個字符 'y', 然後我們又按下回車,'y'和'\n'又一起准備被釋放,由於程序裡沒有第3個getchar(),所以'y'和'\n'還留在緩沖區,但它們兩個已經是在准備狀態中,如果程序又出現一個getchar(),'y'不需要你按回車它會直接進入到第3個getchar(),getchar()是依次獲取,按先後順序,不會先獲取'\n',而'\n'正等待著馬上進入第4個getchar()