int b; char c;
scanf("%d", &b);
scanf("%c", &c);
printf("%d %c", b, c);
輸入 1.2 時,第一個 %d 讀取 1,緩衝區殘留 .2\n。第二個 %c 讀取 .,而非預期的換行符。
while (scanf("%d", &b) == 1) { ... }
輸入 1.2:
%d 成功匹配 1,回傳 1,迴圈繼續。緩衝區剩 .2\n。%d 嘗試匹配整數,遇到 . 失敗,回傳 0,迴圈條件 ==1 為假,**迴圈終止**。緩衝區仍殘留 .2\n,導致後續讀取失敗。a = scanf("%d", &b);
printf("%d", a); // 輸入 1.2 也輸出 1,但程式結束,無後續讀取問題
while (getchar() != '\n'); 吞掉殘留字元。char line[100];
while (fgets(line, sizeof(line), stdin)) {
if (sscanf(line, "%d", &b) == 1) {
// 成功解析整數
}
}
0 表示匹配失敗,EOF 表示輸入結束,>0 表示成功匹配項數。fgets 讀整行,再用 sscanf 或 strtol 解析。scanf,每次呼叫後檢查回傳值,失敗時清理緩衝區。"%d" 會跳過前導空白,但 不會跳過非數字字元(如 .、a)。