在 C++ 中使用 cin 讀取整數變數 n 控制 while(n) 迴圈時,若輸入 1 並按 Enter,迴圈正常執行一次;但若一次輸入 1 1(中間以空格分隔)再按 Enter,程式會連續輸出兩次「輸入繼續」,且第二次並未等待新的輸入,直接跳過 cin。這看似違反直覺,實則是流緩衝區機制使然。
cin 屬於格式化輸入,其讀取整數時會自動跳過前導空白字元(空格、換行、Tab),並讀取連續的數字字元直到遇到非數字或空白字元為止。關鍵在於:
1 1\n 時,緩衝區實際存放的是 '1' ' ' '1' '\n'。cin >> n:讀取第一個 1,停在空格處,迴圈體執行,輸出提示。cin >> n:迴圈再次進入,cin 發現緩衝區仍有殘留資料(空格、第二個 1、換行),直接讀取第二個 1,無需等待使用者新輸入,導致迴圈連續執行兩次。輸入: "1 1\n"
緩衝區: ['1', ' ', '1', '\n']
第 1 次 cin >> n:
讀取 '1' -> n=1
緩衝區剩餘: [' ', '1', '\n']
執行迴圈體,輸出提示
第 2 次 cin >> n:
跳過空格 ' '
讀取 '1' -> n=1
緩衝區剩餘: ['\n']
執行迴圈體,輸出提示(未等待新輸入)
第 3 次 cin >> n:
跳過 '\n',緩衝區空 -> 等待使用者輸入
若輸入 a、x 或 Ctrl+Z/Ctrl+D(EOF),cin 進入失敗狀態,n 不再改變,迴圈可能陷入無限輸出。正確做法是檢查輸出狀態:
int n = 1;
while (cin >> n) { // 直接用輸出運算式作為條件
cout << "輸入繼續" << endl;
}
若需強制等待新行輸入,可用 cin.ignore(numeric_limits 清空當前行殘留字元。
C++ 流輸入的「空白字元忽略」與「緩衝區殘留」特性,是導致該現象的根本原因。理解緩衝區機制、善用輸出狀態判斷,能避免此類陷阱,編寫更健壯的互動程式。