鍵盤緩衝區殘留換行符導致 getchar()/scanf() 連續讀取失效,是 C 語言初學者最常遇到的問題。本文分析原因,對比多種清空方案,給出跨平台最佳實踐。
char ch1, ch2;
ch1 = getchar(); // 輸入 'a' + 回車
ch2 = getchar(); // 直接讀到殘留的 '\n',程序結束
printf("%d %d", ch1, ch2); // 輸出 97 10 (10 是 '\n' 的 ASCII)
原因:標準輸入流緩衝區讀取遇到換行符結束,換行符留在緩衝區,下一次讀取直接取走它。
scanf("%c", &ch1);
fflush(stdin); // 或 rewind(stdin)
scanf("%c", &ch2);
⚠️ 僅限 Windows,Linux/Unix 下行為未定義(C 標準規定 fflush 僅適用於輸出流)。
scanf("%c", &ch1);
setbuf(stdin, NULL); // 將 stdin 設置為無緩衝,實際清空殘留
scanf("%c", &ch2);
✅ Windows + Linux 雙平台測試通過。原理:將標準輸入流設置為無緩衝模式,丟棄現有緩衝區內容。
int readChar() {
int c = getchar();
while (c != EOF && c != '\n') // 跳過換行符
c = getchar();
return c;
}
或使用 fgets 讀整行再 sscanf 解析,徹底避開緩衝區問題。
fflush(stdin),但非標準setbuf(stdin, NULL)scanf/getchar