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

C 語言清除 scanf 殘留緩衝區換行符的標準做法

     編輯:關於C語言

問題現象

int k; scanf("%d", &k);
char c = getchar();   // 直接讀到殘留的 '\n',導致邏輯錯誤

通用清理函數

void safe_flush(FILE *fp) {
    int ch;
    while ((ch = fgetc(fp)) != EOF && ch != '\n');
}

使用範例

#include <stdio.h>

void safe_flush(FILE *fp);

int main() {
    int k;
    printf("請輸入整數:");
    scanf("%d", &k);
    safe_flush(stdin);          // 清除緩衝區剩餘字元(含 \n)

    char c;
    printf("請輸入一個字元:");
    c = getchar();              // 現在能正確讀取使用者輸入
    printf("整數=%d, 字元=%c\n", k, c);
    return 0;
}

原理解析

  • scanf("%d") 讀完整數後,**停在第一個非數字字元**(通常是 \n)上;
  • 後續 getchar()/fgets() 會直接讀走這個 \n;
  • safe_flush 循環讀取並丟棄直到 \n 或 EOF,乾淨重置流位置。

替代方案

  • 輸入一律用 fgets(buf, sizeof(buf), stdin) 讀整行,再用 sscanf 解析,徹底避免殘留問題;
  • Windows 下可用 fflush(stdin)(非標準,僅 MSVC 支援);
  • C11 新增 getchar_unlocked 等非鎖定版本,但清理邏輯相同。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved