第一個獨立程序正常讀取字符並判斷字母/ASCII。第二個程序先讀 int,後讀 char,直接跳過字符輸入,打印結果異常。
scanf("%d", &a) 讀取整數後,**換行符 '\n' 殘留在輸入緩衝區**。緊接的 scanf("%c", &c) 直接讀走這個 '\n',導致實際字符輸入被下一個 scanf 讀取,邏輯亂套。
scanf("%c", &c); // 吃掉殘留 \n
scanf("%c", &c); // 讀取真正字符
scanf(" %c", &c); // %c 前加空格,自動跳過所有空白字符(\n, \t, 空格)
char buf[32];
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%c", &c);
// ... 讀 int a 後
printf("請輸入一個字符:\n");
scanf(" %c", &c); // 關鍵:%c 前加空格
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
printf("輸入的字符%c是字母\n", c);
else
printf("輸入的字符%c不是字母\n", c);
int d = c;
printf("字符%c的ASCII碼是%d\n", c, d);
scanf("%d") 後接 scanf("%c")、scanf("%s")、gets()、fgets() 皆會遇到此問題。fgets + sscanf 避開掃描器緩衝區陷阱。scanf 不會自動消耗換行符,**%c 直接讀取下一字符(含 \n)**。**scanf(" %c", &c) 加空格是最簡潔標準的修復**,新手必記。