在處理「多組測試,輸入 0 結束」的題目時,正確判斷 scanf 返回值至關重要。scanf 的返回值有三種情況,直接決定迴圈邏輯是否正確。
scanf("%d", &n) 返回 1 表示成功讀取一個整數。%d,返回 0,且 n 值不變,輸入緩衝區仍殘留 "abc",導致無限迴圈。while ((scanf("%d", &n)) != 0) // 錯誤
當輸入非數字(如 "abc")時,scanf 返回 0,迴圈條件為假而退出,但題目要求只有輸入 0 才結束。更嚴重的是,若輸入流結束返回 EOF (-1),條件 -1 != 0 為真,進入迴圈處理未初始化的 n,造成未定義行為。
while (scanf("%d", &n) == 1 && n != 0) // 正確
scanf(...) == 1:確保成功讀取一個整數(排除格式錯誤與 EOF)。n != 0:業務邏輯判斷,輸入 0 時結束迴圈。此寫法能正確處理:正常數字輸入、非數字輸入(配合清理緩衝區)、EOF 結束、以及 0 終止條件。