代碼:
#include <stdio.h> int main() { int c; while ((c = getchar()) != EOF) putchar(c); return 0; }
運行時發現:輸入一行字符按回車後,程序才一次性輸出整行,而非逐字符即時回顯。
getchar() 只能逐個讀取已提交的行緩衝內容。putchar() 寫入用戶空間緩衝區,遇換行符或緩衝區滿才刷新。setbuf(stdin, NULL); // 或 setvbuf(stdin, NULL, _IONBF, 0)
需調用系統相關 API(如 POSIX termios、Windows _getch()),繞過行緩衝直接讀取鍵盤事件。
若只關心輸出即時性,在 putchar() 後調用 fflush(stdout)。
| 類型 | 觸發刷新條件 | 典型設備 |
|---|---|---|
| 無緩衝 | 每次 I/O 操作直接讀寫設備 | stderr、終端輸入(非規範模式) |
| 行緩衝 | 遇換行符 \n、緩衝區滿、輸入請求時 | stdin、stdout(連終端時) |
| 全緩衝 | 緩衝區滿、程序正常結束、fflush() | 文件、管道、重定向後的 stdout |
getchar()/putchar() 是無緩衝的。ncurses、termios、Conio.h)。