scanf("%d", &x); // 輸入 "s\n" → 匹配失敗,'s' 和 '\n' 留在緩衝區
scanf("%d", &y); // 緩衝區首字元 's' 非數字,再次失敗
scanf("%c", &a); // 讀到 's'(或 '\n'),非預期
%d 匹配失敗時不消耗任何輸入字元,緩衝區原封不動。%d 仍面對相同非數字字元,持續失敗。%c 會讀取緩衝區第一個字元(包含空白、換行),導致看似「跳過」輸入。int x, y;
char c;
// 讀整數,檢查回傳值
if (scanf("%d", &x) != 1) {
// 清空緩衝區直到換行
while (getchar() != '\n');
// 可選:提示重新輸入
}
// 讀字元(跳過空白)
scanf(" %c", &c); // 格式字串前加空白,自動跳過 \n \t 空格
scanf("%d", &x); // 輸入 "s 1"
scanf("%d", &y);
printf("%d%d", x, y); // x、y 未初始化且讀取失敗,印出亂碼
第一次 %d 失敗,x 保留垃圾值;第二次同理;1 從未被讀取。
scanf 回傳值(成功匹配項目數)。while (getchar() != '\n');" %c" 跳過空白,或改用 fgets 整行讀取再 sscanf 解析。int x = 0, y = 0;scanf 匹配失敗不消耗輸入,導致後續讀取連環失敗。務必檢查回傳值、清空緩衝區、初始化變數,或改用 fgets+sscanf 更健壯的輸入模式。