標籤:完成 stdio.h ref com linu tchar 空格 pyw clu
博主最近在學習C語言編程,在書中的程式碼範例中出現了下面的程式碼片段:
#include<stdio.h>int main(){char a[5];int i;printf("請依次輸入值:\n");for(i=0;i<5;i++){ scanf("%c",&a[i]); getchar(); //為什麼要加一個getchar()?}printf("\n");for(i=0;i<5;i++){ printf("%c ",a[i]);}getchar();return 0;}
運行結果
對於初學的博主不理解了,為什麼scanf擷取輸入的字元後,還要加一個getchar()呢?
於是去掉該語句,結果程式運行輸入到c字元就跳轉結束了。
百思不得姐,於是求助美麗的度娘。。。。
滑鼠劃呀劃。。。
叮叮。。終於發現有其他朋友也有相同的困惑:
有位熱心網友回答的很到位(https://zhidao.baidu.com/question/147733301.html?fr=iks&word=C+getchar+scanf&ie=gbk):
c語言中在讀取鍵盤資料時,一般是帶緩衝的資料輸入,需要按斷行符號鍵才能完成該“行”資料的輸入確認。
而 scanf()函數對這個斷行符號確認符並不進行處理,斷行符號符會留在輸入緩衝區中。
因此,在下一個讀“字元”操作函數(getchar, scanf("%c"), gets()等)運行時,會讀到這個字元。
而在讀數值型資料或字串時,scanf()會從第一個非空白字元(空白字元指:斷行符號,空格,TAB鍵)開始讀取,自動忽略前面的空白字元,而遇到空白字元結束該類型資料的輸入。
因此,是否一定要在scanf後面跟個 getchar吃斷行符號,要看下一個輸入的資料類型是什麼,如果是讀字元類操作,處理辦法有多種方式:
一、用fflush(stdin)命令強行重新整理輸入緩衝,丟棄輸入緩衝中的資料,此種方法在windows下使用有效,linux無效。
123 |
char ch; fflush (stdin); //不管緩衝中有沒有資料,強行清除 ch= getchar (); //這裡會等待使用者輸入一個字元 |
二、前面有讀資料操作,現在要執行讀字元操作,則可用getchar()來吃掉前面的斷行符號確認
12345 |
int i; char ch; scanf ( "%d" , &i ); //讀一個整數,斷行符號確認 getchar (); //先吃掉斷行符號確認符,這兩句,效果同下一方法的那一句 ch= getchar (); //這裡會等待使用者輸入一個字元 |
三、在scanf()書寫上做文章,如:讀一個資料,以斷行符號確認,則輸寫成如下格式
1234 |
int i; char ch; scanf ( "%d%*c" , &i ); //%*c表示讀一個字元,並不賦值給任何變數 ch= getchar (); //這裡不會讀到斷行符號符 |
問題到此終於豁然開朗,原來加getchar()是為了把輸入字元資料後敲擊的斷行符號從緩衝中提取出來,這樣就不會影響到下一次輸入過程。
C語言編程之--scanf()函數與getchar()函數搭配來理解C程式的輸入緩衝(buffer)