1. 程式人生 > >C語言編程之--scanf()函數與getchar()函數搭配來理解C程序的輸入緩存(buffer)

C語言編程之--scanf()函數與getchar()函數搭配來理解C程序的輸入緩存(buffer)

使用 ges border urn alt color 數值 amp tps

博主最近在學習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無效。

1 2 3 char ch; fflush(stdin); //不管緩存中有沒有數據,強行清除 ch=getchar(); //這裏會等待用戶輸入一個字符

二、前面有讀數據操作,現在要執行讀字符操作,則可用getchar()來吃掉前面的回車確認

1 2 3 4 5 int i; char ch; scanf("%d", &i ); //讀一個整數,回車確認 getchar(); //先吃掉回車確認符,這兩句,效果同下一方法的那一句 ch=getchar(); //這裏會等待用戶輸入一個字符

三、在scanf()書寫上做文章,如:讀一個數據,以回車確認,則輸寫成如下格式

1 2 3 4 int i; char ch; scanf("%d%*c", &i ); //%*c表示讀一個字符,並不賦值給任何變量 ch=getchar(); //這裏不會讀到回車符

問題到此終於豁然開朗,原來加getchar()是為了把輸入字符數據後敲擊的回車從緩存中提取出來,這樣就不會影響到下一次輸入過程。

C語言編程之--scanf()函數與getchar()函數搭配來理解C程序的輸入緩存(buffer)