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

來源:互聯網
上載者:User

標籤:完成   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)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.