輸入流緩衝區舉例說明及解決方案

2021-08-19 08:57:34 字數 1540 閱讀 7157

對c語言輸入輸出流和緩衝區的深入理解,c語言緩衝區(快取)詳解,緩衝區又稱為快取,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區,緩衝區根據其對應的是輸入裝置還是輸出裝置,分為輸入緩衝區和輸出緩衝區,為什麼要引入緩衝區,我們先把讀出的資料放在緩衝區,計算機再直接從緩衝區中取資料,等緩衝區的資料取完後再去磁碟中讀取,再加上計算機對緩衝區的操作大大快於對磁碟的操作,故應用緩衝區

( 摘自博主名為v-man)

程式說明:

5行:首先執行程式輸入:abc回車;

6行:首先列印出來97(a);

7行:跳過使用者按鍵,getchar()直接從輸入流中讀取字元,然後與『\n』比較是否相等,相等為0,不想等為1,再傳送給c。

11行:暫停

#重點來了

整個流程:abc 在輸入介面的時候就已經存入輸入流緩衝區中了,通過回車(』\n『)執行程式(回車也會被存入輸入流緩衝區中),然後每次通過getchar從輸入流緩衝區中讀取乙個字元。

總而言之————輸入流緩衝區的存在,使得編譯器從鍵盤讀到回車符的時候程式才會進入getchar()這個函式,getchar()才開始挨個讀取字元。

問題(一):那麼這裡有多少個字元儲存在輸入流緩衝區中呢?

答案:是3+1=4個字元(6:3個字母 ,1:代表』\n『及是回車)(這裡注意一下,對於getchar(),scanf()會以回車為結束標誌 但卻會將回車作為字元存入緩衝中去,這裡不細講)。

問題(二):getchar()被呼叫多少次?

答案:4次(直到遇到』\n『,注意最後是接收了'\n'然後進行比較了的,有種光單獨使用getchar()接收字元而不進行其他操作,這是可行的,用來清除緩衝區)。

問題(三):如果我們不輸出或者不清除輸入流緩衝區的資料有什麼後果呢?

答案是:一直存在輸入流緩衝區中,等到再次需要讀取資料時,你不會有輸入機會及是跳過使用者按鍵,會被getchar(),scanf()等等 直接接收來自輸入流緩衝區的資料。

備註:這只是舉例簡單說明了輸入流緩衝區,getchar(),scanf()等等都是通過讀取輸入流緩衝區的資料,知道這些對於新             生應該足夠適用了。

附加題(留給讀者):   而有沒有不是通過輸入流緩衝區的呢,由鍵盤直接輸入?

如何清空輸入流緩衝區:

提供二種解決初學者問題辦法:1.在windows環境下可以直接使用fflush(stdin);rewind(stdin);函式進行清除輸入流緩衝區的字元

2.還有個較為常用的迴圈是while (getchar() != '\n')    自己體會。

帶有緩衝區的字元輸入流

帶有緩衝區的字元輸入流 使用這個流的時候,不需要自定義char陣列,或者不用定義byte陣列,自帶緩衝 當乙個流的構造方法中,需要乙個流的時候,這個被傳進來的流叫做節點流,外部負責包裝的流,叫做包裝流,或者處理流。建立物件時 bufferedreader的構造方法特殊,要接受乙個reader型別的引...

輸入緩衝區與輸出緩衝區

本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...

清空輸入緩衝區

清空輸入緩衝區 cin.clear 清除錯誤標記,比如要求輸入int型,但我們輸入了char型,就會導致輸入錯誤,產生錯誤標記 cin.sync 清空輸入緩衝區 cin.ignore n,ch 第乙個引數是清空輸入緩衝區的大小,第二個引數是終止字元 注 終止字元也會被丟棄 常用形式有以下兩種 cin...