getchar()的作用?手機使用者863989895462019-09-29 00:57:08

實際上getchar函式是從緩衝區讀取資料的,而不是從你的螢幕上讀取資料。

鍵盤負責往緩衝區寫入資料,而getchar函式負責讀取資料。

getchar函式不會關心你實際輸入的是什麼,它只負責從緩衝區讀取資料,而且每次讀取一個字元。

你點選鍵盤的時候,實際上是往緩衝區輸入:

你按下a,則緩衝區中儲存了一個字元a

你按下b,則緩衝區中又儲存了一個字元b

你按下c,則緩衝區中又儲存了一個字元c

你按下1,則緩衝區中又儲存了一個字元1

你按下backspace刪除鍵,則緩衝區中刪除了一個字元(最後儲存的那個1)

除非你按下Enter,不然你其實就是在往緩衝區中塞資料。

關鍵點來了:當你按下Enter的時候,發生了兩個動作。首先是往緩衝區儲存了一個‘\n’字元,然後才執行重新整理

重新整理其實就是告訴getchar(或者任何需要讀取這個緩衝區的函式,比如scanf),現在你可以開始讀取我儲存的資料了。

於是現在緩衝區中儲存的資料是[a,b,c,‘\n’] ,

注意緩衝區的最後會有一個換行符(因為你敲了Enter鍵)

。 好,現在開始讀取資料:

第一次呼叫getchar,則讀取緩衝區中的第一個資料a

第二次呼叫getchar,將會讀取緩衝區中的第二個資料b

第三次呼叫getchar,將會讀取緩衝區中的第三個資料c

第四次呼叫getchar,將會讀取緩衝區中的最後一個數據‘\n’,也就是換行符。

如果你while迴圈來呼叫n次getchar(),就會按順序讀取緩衝區n次,就好像是按順序讀取陣列一樣。

如果getchar()發現緩衝區中沒資料了,也就是說緩衝區的資料已經被讀完了,沒資料可讀了。那麼getchar函式會等你再次輸入資料並且按下Enter執行重新整理。

如果緩衝區有8個字元,你卻只調用了5次getchar,那麼緩衝區會剩下3個字元。因為你只讀了5個字元。

可以實際程式設計上機嘗試,懂得了原理,就會比較容易理解了。

為什麼要使用緩衝區呢?

基本的設計考慮是節約時間,提高資源利用率。並且還附帶一個額外功能:可以修改緩衝區的資料,修正錯誤的輸入。

另外,我嘗試從兩個不同角度去解釋一下緩衝區和getchar的機制,可能會有助於新手理解:

如果強行從“面向物件”上去理解,這個緩衝區的設計叫做“分離關注點”:

鍵盤負責寫入資料,允許修改(也就是回退刪除),關注點是“寫”

getchar只負責按字元讀取資料,關注點是“讀”

如果強行用“設計模式”理解這個緩衝區設計,那就是一個簡單的“觀察者模式”:

鍵盤生成緩衝區資料,負責

寫入

資料,並在資料發生變化的時候通知訂閱者(也就是執行重新整理操作)

getchar作為一個訂閱了“緩衝區資料”的函式,當收到“重新整理”指令的時候,就開始按順序

讀取

資料,每次只會讀取緩衝區中的一個字元。

實際上,C語言中的getchar()函式相當於緩衝區的一個迭代器,專門用來讀取緩衝區中的資料的。