for (i = 0; getchar() != '\n'; i++) { // 陷阱 1
cin >> a[i];
// ...
}
for (i = 0; i <= k; i++) { // 陷阱 2
cout << a[i] << " ";
}
1.5 2.3 3.7\n,緩衝區內容:'1' '.' '5' ' ' '2' ... '\n'。getchar() 讀取第一個字元 '1' 並判斷非 '\n',迴圈繼續。cin >> a[0] 從緩衝區讀取剩餘 .5 2.3 3.7,解析失敗或數值錯誤。i <= k 多跑一次k 為實際讀入個數 (假設 3),有效索引 0,1,2。i <= k 會跑 0,1,2,3 四次,a[3] 為未初始化記憶體 → 輸出亂碼。// 方案 A:純 cin 讀取,利用 EOF 或特定哨兵值結束
int k = 0;
while (k < 100 && cin >> a[k]) {
if (a[k] < 0) { /* 錯誤處理 */ }
k++;
}
// 方案 B:讀整行再用 stringstream 解析 (最穩健)
string line;
getline(cin, line);
stringstream ss(line);
while (k < 100 && ss >> a[k]) k++;
// 輸出迴圈:嚴格 i < k
for (int i = 0; i < k; i++) cout << a[i] << " ";
i < n:n 為元素個數,有效索引 0 ~ n-1。if (!(cin >> val)) { cin.clear(); cin.ignore(numeric_limits::max(), '\n'); } 。拒絕「C/C++ 混合 I/O」,堅守「迴圈邊界 < n」鐵律,即可消滅此類低級且隱蔽的陣列存取錯誤。