首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言清空鍵盤緩衝區:Windows/Linux 跨平台完美方案

     編輯:關於C語言

鍵盤緩衝區殘留換行符導致 getchar()/scanf() 連續讀取失效,是 C 語言初學者最常遇到的問題。本文分析原因,對比多種清空方案,給出跨平台最佳實踐。

1. 問題現象與原因分析

char ch1, ch2;
ch1 = getchar(); // 輸入 'a' + 回車
ch2 = getchar(); // 直接讀到殘留的 '\n',程序結束
printf("%d %d", ch1, ch2); // 輸出 97 10 (10 是 '\n' 的 ASCII)

原因:標準輸入流緩衝區讀取遇到換行符結束,換行符留在緩衝區,下一次讀取直接取走它。

2. Windows 方案:fflush(stdin) / rewind(stdin)

scanf("%c", &ch1);
fflush(stdin); // 或 rewind(stdin)
scanf("%c", &ch2);

⚠️ 僅限 Windows,Linux/Unix 下行為未定義(C 標準規定 fflush 僅適用於輸出流)。

3. 跨平台方案:setbuf(stdin, NULL)

scanf("%c", &ch1);
setbuf(stdin, NULL); // 將 stdin 設置為無緩衝,實際清空殘留
scanf("%c", &ch2);

✅ Windows + Linux 雙平台測試通過。原理:將標準輸入流設置為無緩衝模式,丟棄現有緩衝區內容。

4. 更穩健的通用讀取封裝

int readChar() {
    int c = getchar();
    while (c != EOF && c != '\n') // 跳過換行符
        c = getchar();
    return c;
}

或使用 fgets 讀整行再 sscanf 解析,徹底避開緩衝區問題。

總結

  • 理解「流緩衝區 ≠ 鍵盤硬件緩衝區」
  • Windows 可用 fflush(stdin),但非標準
  • 跨平台首選 setbuf(stdin, NULL)
  • 工程上建議封裝安全輸入函數,避免直接用 scanf/getchar
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved