2017-05-01 127 views
0

我試圖遍歷並輸出向量,但除了要求我輸入外沒有任何事情發生。C++沒有cout信息顯示

int main() { 
    string a; 

    vector<string> test; 
    while (std::cin>>a) { 
     test.push_back(a); 
    } 
    for (vector<string>::iterator i= test.begin(); i!= test.end(); ++i) { 
     std::cout << *i << std::endl; 
    } 
    system("pause"); 
    return 0; 
} 
+1

所以你的問題不是擺脫while循環,與cout無關? – TZHX

+1

你如何期望從這個循環中逃脫:'while(std :: cin >> a)'? –

+0

我打算在輸入完成時跳出循環。 –

回答

1

std::cin >> a將跳過所有空白,並只能將非空白字符轉換成字符串。這意味着,除了別的以外,即使您只是按下Enter鍵,a也永遠不會爲空。所以即使支票a.empty()在這裏也不會有好處。循環將一直持續到您的I/O環境出現問題(即幾乎從不),或者您的內存不足,因爲矢量變得太大,在這種情況下,循環會通過異常退出。

您需要做的是調用std::getline來代替。該函數讀取整行輸入並在換行符後停止,而不是完全忽略換行符。然後,您可以檢查empty()以查看是否輸入了任何內容。這裏有一個例子:

#include <iostream> 
#include <string> 
#include <vector> 

int main() { 
    std::string a; 

    std::vector<std::string> test; 
    while (std::getline(std::cin, a) && !a.empty()) { 
     test.push_back(a); 
    } 
    for (auto const& s : test) { 
     std::cout << s << '\n'; 
    } 
} 

我還簡化了代碼,並冒昧向您展示using namespace std;system("pause")是壞主意。

+0

非常感謝。自從循環在換行符後停止後,還有一個問題似乎沒有必要添加空()。 –

+0

@JoeyLU:如果你刪除了'empty()'檢查,那麼循環將再次是無止境的,因爲'std :: getline'不會將'std :: cin'設置爲失敗狀態,因爲輸入的字符串是空。 –

+0

感謝您的進一步解釋 –