我們先來看一段代碼:
#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);
輸入緩衝區:
在終端輸入的數據會先存儲在輸入緩衝區中,然後再根據佔位解析成對應的數據,如果前一次輸入的數據有殘留的垃圾,會影響後續數據的輸入。
-
輸入字符時前一次的輸入會殘留一個空格或’\n’,解決方法就在%c前加一個空格。
-
如果輸入時有若干個垃圾數據,會影響後續所有數據的輸入。
如何避免呢?
-
使用正則表達式,注意:必須確定有垃圾數據時再使用。
scanf("%*[^\n]"); // *從緩衝中獲取數據但不存儲到變量中
scanf("%*c");
-
設置緩衝區中的位置指針
-
stdin->_IO_read_ptr 開始位置
stdin->_IO_read_end 結束位置
stdin->_IO_read_ptr =stdin->_IO_read_end;