scanf("%d", &a); // 輸入數字並按回車,緩衝區殘留 '\n'
scanf("%c", &b); // 直接讀取殘留的 '\n',而非用戶輸入的字符
提示「請輸入等級」時程序直接跳過,打印「等級輸入錯誤」,因為 b == '\n' 不匹配任何 case。
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() 是標準應對。