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

C語言:標準輸入(stdin)緩衝區清空的正確姿勢

     編輯:關於C

前言

在 C 語言中,處理標準輸入(stdin)的緩衝區殘留字元是初學者常遇到的棘手問題。當使用 scanf 讀取數值後,緩衝區往往會留下換行符(\n),導致後續的 scanf("%c", &ch) 直接讀取到這個換行符,而非使用者預期的字元輸入。本文將分析幾種常見的清空緩衝區方法,並推薦最具可移植性的最佳實踐。

問題重現

以下程式碼意圖先讀取一個整數,再讀取一個字元:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int num = 0;
    char ch = ' ';
    scanf("%d", &num);
    scanf("%c", &ch); // 預期讀取字元,實際讀到殘留的 '\n'
    printf("hello bit\n");
    system("pause");
    return 0;
}

輸入 7 並按 Enter 後,程式直接輸出 "hello bit",並未等待字元輸入。原因在於 scanf("%d") 讀取整數後,緩衝區仍保留換行符,隨後的 %c 直接讀取了它。

方案比較

1. fflush(stdin) —— 不推薦

C 標準規定 fflush 僅適用於輸出流(stdout)。雖然 MSVC 等編譯器擴展支援 fflush(stdin),但在 GCC/Clang 上屬於未定義行為,不可移植。

2. setbuf(stdin, NULL) —— 效果有限

將 stdin 設為無緩衝模式。但在某些系統上對交互式輸入無效,且無法清除已存在於緩衝區的字元。

3. 循環 getchar() 清理 —— 推薦做法

利用巨集或函式,持續讀取字元直到遇到 \n 或 EOF:

#define CLEAR_BUF() \
    do { \
        int c = 0; \
        while ((c = getchar()) != EOF && c != '\n') \
            ; \
    } while(0)

int main() {
    int num = 0;
    char ch = ' ';
    scanf("%d", &num);
    CLEAR_BUF(); // 清空殘留換行符
    scanf("%c", &ch);
    printf("hello bit\n");
    return 0;
}

此法符合 C 標準、跨平台可用、邏輯清晰,是教學與工程實踐的首選。

總結

  • 避免使用 fflush(stdin)。
  • 採用 while ((c = getchar()) != '\n' && c != EOF) 循環清理緩衝區。
  • 封裝為巨集或函式便於複用,提高程式健壯性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved