2014-04-29 110 views
3

我遇到while循環的問題。 while循環後面的語句沒有執行,我不知道爲什麼。我是C++新手,無法弄清楚這一點。我試圖把一些單詞作爲用戶的輸入,並將它們存儲在一個字符串向量中,只是爲了練習。這裏是我的代碼:While循環未執行後的聲明

#include "stdafx.h" 
#include <string> 
#include <iostream> 
#include <vector> 

using std::vector; 
using std::string; 
using std::cin; 
using std::cout; 
using std::endl; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    vector<string> list; 
    string word; 

    while(cin >> word) 
    { 
     list.push_back(word); 
     cout << "Added " << word << endl; 
    } 

    cout << endl; 
    cout << "Done" << endl; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

當我運行此控制檯應用程序,我可以看到,while循環執行中的語句和信息「新增」,而是「做」的消息不顯示。我已經通過在while循環之後指定其他語句(例如,從同一個字符串向量中獲取&顯示值的for循環)來嘗試此操作,但是在此while循環執行後沒有語句。只有while循環之前和之內的語句被執行,我不知道爲什麼。

+1

你如何終止輸入流?除非你這樣做,否則你永遠不會退出循環。嘗試將文件重定向爲標準輸入,例如'a.exe molbdnilo

+0

我認爲它是一個無限循環,每次你給它輸入它都會起作用。你必須在某個地方打破循環。 – Himanshu

+0

好吧,我猜這應該是在用戶停止輸入單詞後立即終止。不是這樣嗎? D: –

回答

1

while循環並沒有結束,因爲cin總是返回soemthing != 0這意味着你陷入了一個無限循環。你需要的是執行中斷環路內的另一個條件:

string stop_string = "exit"; 

while(cin >> word) 
{ 
    if (stop_string.compare(word)) 
     break; 

    list.push_back(word); 
    cout << "Added " << word << endl;   
} 

,或者您可以使用std::getline檢測到空線,如約阿希姆Pilebord建議。

+0

我怎麼可以如此笨拙哈哈。謝謝你:) –

+0

好吧,編程語言有很多奇怪的概念,作爲初學者,很可能發生這樣的錯誤。但這就好,我們都是這樣學習的。我們所有人至少犯了一次這樣的錯誤。 ;) – displayname

3

只要輸入有效的字符串,循環將繼續。而只是輸入一個空行將不起作用,因爲輸入操作符會阻塞,直到它讀取一個非空白字符。您需要通過按CTRL-Z(文件結束鍵盤快捷鍵)實際「終止」字符串。


如果你想檢測空行,並用這些終止條件,則需要使用std::getline

std::string line; 
while (std::getline(std::cin, line) && !line.empty()) 
{ 
    ... 
} 
+0

我認爲在Linux上它是Ctrl + D,而不是Ctrl + Z。 Ctrl + Z將應用程序置於bakcground – fritzone

+0

Ctrl + Z用於Windows – Youda008

+0

@fritzone在Linux(以及OSX和BSD以及其他POSIX系統)上,它通常是'CTRL-D',但是這個程序是一個windows程序(「 stdafx.h「'header和'_tmain'函數表示Visual Studio),其中使用了'CTRL-Z'。 –