首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VS2010 中 C++ list 容器輸入輸出問題解析

     編輯:程式設計綜合問答

問題背景

在 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 信號,導致後續的輸出代碼永遠無法執行。

解決方案

方法一:使用 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。初學者常誤以為換行符會結束循環,實則不然。根據場景選擇合適的輸入終止方式,能避免此類「程序卡死」的假象。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved