首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言 scanf 後殘留換行符導致 %c 讀取空白:getchar() 吸收換行符修復

     編輯:程式設計綜合問答

問題代碼


scanf("%d", &a); // 輸入數字並按回車,緩衝區殘留 '\n'
scanf("%c", &b); // 直接讀取殘留的 '\n',而非用戶輸入的字符

現象

提示「請輸入等級」時程序直接跳過,打印「等級輸入錯誤」,因為 b == '\n' 不匹配任何 case。

修復:插入 getchar() 吸收換行符


scanf("%d", &a);
getchar(); // 關鍵:讀取並丟棄緩衝區中的 '\n'
scanf("%c", &b); // 現在正確等待用戶輸入字符

原理圖解


輸入: 6 5 \n
scanf("%d", &a) → 讀取 6, 緩衝區剩 "5 \n"
scanf("%d", &a) → 讀取 5, 緩衝區剩 "\n"
scanf("%c", &b) → 讀取 \n (若無 getchar)
getchar()       → 讀取 \n, 緩衝區空
scanf("%c", &b) → 等待新輸入

更穩健方案:空格跳過空白字符


scanf(" %c", &b); // 格式串前加空格,自動跳過所有空白字符(\n, \t, 空格)

%c 前的空格不是字面量,而是掃描集指令:跳過任意數量空白字符。

完整修正代碼


#include 

void main() {
    char b;
    int a, i, s;
    printf("請輸入班級總人數\n");
    scanf("%d", &s);
    i = 1;
    while (i <= s) {
        printf("請輸入該同學號數\n");
        scanf("%d", &a);
        printf("請輸入該同學的等級\n");
        scanf(" %c", &b); // 關鍵修復:%c 前加空格
        switch(b) {
            case 'a': case 'A': printf("號數:%d 等級:%c 分數:85~100\n", a, b); break;
            case 'b': case 'B': printf("號數:%d 等級:%c 分數:70~84\n", a, b); break;
            case 'c': case 'C': printf("號數:%d 等級:%c 分數:60~69\n", a, b); break;
            case 'd': case 'D': printf("號數:%d 等級:%c 分數:0~59\n", a, b); break;
            default: printf("號數:%d 等級輸入錯誤!\n", a); break;
        }
        i++;
    }
}

延伸:清空輸入緩衝區通用宏


#define CLEAR_INPUT() while(getchar() != '\n');
scanf("%d", &a);
CLEAR_INPUT(); // 循環讀取直到換行符

**核心教訓**:scanf("%c") **不跳過空白字符**,%d/%s/%f 會跳過。格式串 " %c" 或 getchar() 是標準應對。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved