C語言基礎課堂總結——緩衝區淺談

我們先來看一段代碼:

#include <stdio.h>
int main()
{
	printf("接下來開始死循環...");
	for( ; ; )
	{
	
	}
}

運行之後我們會發現,printf的結果並沒有被顯示,程序跳過了printf直接開始了死循環。那這是爲什麼呢?這就要講到C語言的緩衝區了。

緩衝區又稱爲緩存,它是內存空間的一部分。也就是說,在內存空間中預留了一定的存儲空間,這些存儲空間用來緩衝輸入或輸出的數據,這部分預留的空間就叫做緩衝區。

緩衝區根據其對應的是輸入設備還是輸出設備,分爲輸入緩衝區和輸出緩衝區。

爲什麼要引入緩衝區

比如我們從磁盤裏取信息,我們先把讀出的數據放在緩衝區,計算機再直接從緩衝區中取數據,等緩衝區的數據取完後再去磁盤中讀取,這樣就可以減少磁盤的讀寫次數,再加上計算機對緩衝區的操作大大快於對磁盤的操作,故應用緩衝區可大大提高計算機的運行速度。

又比如,我們使用打印機打印文檔,由於打印機的打印速度相對較慢,我們先把文檔輸出到打印機相應的緩衝區,打印機再自行逐步打印,這時我們的CPU可以處理別的事情。

現在您基本明白了吧,緩衝區就是一塊內存區,它用在輸入輸出設備和CPU之間,用來緩存數據。它使得低速的輸入輸出設備和高速的CPU能夠協調工作,避免低速的輸入輸出設備佔用CPU,解放出CPU,使其能夠高效率工作。

今天我們就淺談運行輸入緩衝區和輸出緩衝區

輸出緩衝區:

當使用printf/puts/putchar等函數顯示數據時,並不會直接顯示在屏幕上,而是先放入的輸出緩衝區中(提高程序的運行效率),當滿足一些條件時纔會顯示在屏幕上:

1、遇到\n
2、從輸出轉換到輸入狀態
3、程序結束
4、當緩衝區滿4k
5、手動刷新fflush(stdout);

輸入緩衝區:

在終端輸入的數據會先存儲在輸入緩衝區中,然後再根據佔位解析成對應的數據,如果前一次輸入的數據有殘留的垃圾,會影響後續數據的輸入。

  1. 輸入字符時前一次的輸入會殘留一個空格或’\n’,解決方法就在%c前加一個空格。

  2. 如果輸入時有若干個垃圾數據,會影響後續所有數據的輸入。

    如何避免呢?

    • 使用正則表達式,注意:必須確定有垃圾數據時再使用。

      scanf("%*[^\n]"); // *從緩衝中獲取數據但不存儲到變量中

      scanf("%*c");

    • 設置緩衝區中的位置指針

    stdin->_IO_read_ptr 開始位置	
    stdin->_IO_read_end 結束位置
   stdin->_IO_read_ptr =stdin->_IO_read_end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章