問題現象
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 等非鎖定版本,但清理邏輯相同。