書籍《C Primer Plus》第 8 章菜單瀏覽示例中提到:若在 count() 函數裡用 scanf("%d", &n) 讀取整數,緩衝區會殘留換行符。隨後調用 get_choice() → get_first() 時,getchar() 會直接讀到這個殘留的換行符,導致菜單邏輯異常。
get_first() 實現為:ch = getchar(); while (getchar() != '\n') continue;get_first() 為單純 return getchar();,則會立即複現「跳過菜單選項」的 Bug。若 get_first() 不清理緩衝區,用戶輸入 3\n 後:
scanf 讀走 3,留下 \n。get_first() 讀到 \n 返回。ch < 'a' || ch > 'c' 成立,提示「請輸入 a,b,c,q」。// 讀取整行並解析,避免殘留字符
char *get_line(char *buf, int size) {
return fgets(buf, size, stdin);
}
int get_int() {
char buf[64];
int val;
while (1) {
if (get_line(buf, sizeof(buf)) && sscanf(buf, "%d", &val) == 1)
return val;
printf("輸入無效,請重新輸入整數:");
}
}
理解緩衝區機制,養成「讀整行、再解析」的習慣,徹底避開 scanf 殘留換行符的坑。