在 C 語言學習初期,scanf 的輸入處理常讓初學者感到困惑。特別是當混合輸入整數與字符時,程序往往會「跳過」字符輸入,或導致運行環境異常退出。本文將深入剖析 scanf 的緩衝區機制,並提供穩健的解決方案。
經典錯誤代碼如下:
#include <stdio.h>
int main() {
int a, b, swap;
char d;
printf("請輸入兩個整數和一個字符:\n");
scanf("%d%d", &a, &b);
scanf("%c", &d); // 錯誤:直接讀取殘留的換行符
if (d == 'y') { ... }
}
現象:
scanf("%d%d", &a, &b) 讀取整數後,輸入流中仍殘留一個換行符 \n。隨後的 scanf("%c", &d) 並不會跳過空白字符,直接讀取這個換行符賦值給 d,導致邏輯判斷失敗。
scanf("%d %d %c", &a, &b, &d); // %c 前的空格會自動跳過任意空白字符
或分步讀取:
scanf("%d", &a);
scanf("%d", &b);
scanf(" %c", &d); // 關鍵:%c 前加一個空格
scanf("%d%d", &a, &b);
getchar(); // 或 scanf("%*c", &dummy); 讀取並丟棄換行符
scanf("%c", &d);
char buf[100];
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d %d %c", &a, &b, &d);
此法徹底避免緩衝區殘留問題,適合生產環境。
" %c";gets(已棄用),改用 fgets。理解 scanf 不會自動消耗換行符(除非格式串含空白),是掌握 C 輸入的關鍵。養成「讀字符前加空格」或「改用 fgets/sscanf」的習慣,能消除 90% 的輸入難題。