回覆列表
  • 1 # 使用者5976899974093

    實際上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作為一個訂閱了"緩衝區資料"的函式,當收到"重新整理"指令的時候,就開始按順序讀取資料,每次只會讀取緩衝區中的一個字元.

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

  • 中秋節和大豐收的關聯?
  • 外牆瓷磚層上直接做真石漆,能牢固嗎?要注意什麼?