在 VS2010 環境下編寫 C++ 代碼時,使用 list<string> 容器存儲用戶輸入的字符串,預期輸入若干字符串(以空格分隔)後按 Enter 鍵,程序應將所有字符串輸出。但實際運行時,控制台窗口無任何輸出,令人困惑。
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main() {
list<string> lvec;
string str;
cout << "Enter some strings: ";
while (cin >> str) {
lvec.push_back(str);
}
for (list<string>::iterator iter = lvec.begin(); iter != lvec.end(); iter++) {
cout << *iter << endl;
}
return 0;
}
核心問題在於 while (cin >> str) 的循環條件。cin >> str 會持續讀取輸入流中的字符串,直到遇到 文件結束符 (EOF) 才會返回 false,導致循環結束。在 Windows 控制台中,EOF 對應的快捷鍵是 Ctrl + Z,而非單純按下 Enter 鍵。
按下 Enter 只是將輸入緩衝區的內容提交給程序,並不會觸發 EOF。因此程序會一直阻塞在輸入循環中,等待更多輸入或 EOF 信號,導致後續的輸出代碼永遠無法執行。
輸入完成後,按 Ctrl + Z(Windows)或 Ctrl + D(Linux/Mac),然後按 Enter 發送 EOF 信號。
修改循環條件,例如輸入特定字符串(如 "end")時結束:
while (cin >> str && str != "end") {
lvec.push_back(str);
}
使用 getline 讀取整行,再用 stringstream 分割:
string line;
getline(cin, line);
stringstream ss(line);
while (ss >> str) {
lvec.push_back(str);
}
理解 cin >> var 的行為至關重要:它阻塞等待輸入,直到 EOF 才返回 false。初學者常誤以為換行符會結束循環,實則不然。根據場景選擇合適的輸入終止方式,能避免此類「程序卡死」的假象。