2010-09-01 56 views
0

我有以下代碼:怪異的行爲與標準::函數getline和std ::矢量<std::string>

std::vector<std::string> final_output; 
std::string input; 

int tries = 0; 
std::cin >> tries; 

int counter = 0; 
while(counter < tries) { 

    std::getline(std::cin, input); 
    final_output.push_back(input); 
    ++counter; 

} 

鑑於輸入:

3 
Here Goes 
Here Goes 2 

的輸出是:

<blank line> 
Here Goes 
Here Goes 2 

奇怪的是,它第一次運行時似乎輸入一個空白行作爲輸入。

但是,如果我的代碼爲:

int tries = 3;   // explicitly specifying the number of tries 
int counter = 0; 
while(counter < tries) {} 

它將按預期工作。爲什麼std::cin >> tries導致代碼失敗?

我與VC++ 2010和g ++ 4.4.3

回答

2

當你輸入tries數,你打回車鍵。在您閱讀tries之後,從返回鍵返回的回車仍然位於輸入緩衝區中。回車通常會被轉換爲換行符。您在getline的下一個電話將讀取輸入緩衝區中的所有內容,直到下一個新行。由於第一個字符是換行符,因此將其讀爲零長度的行(即換行符之前的零個字符)。

+0

謝謝,我現在明白了。 – user225312 2010-09-01 20:13:10

1

的第一個條目的換行符仍然在輸入緩衝器進行了測試。

用戶可於cin閱讀嘗試後打電話std::cin.ignore();

這樣的換行符被丟棄。

我發現,解釋了很多事情關於使用I/O一個很好的鏈接:

+0

但我不明白?我只是輸入了一個'int'。爲什麼之後會有新的線路? – user225312 2010-09-01 20:11:45

+0

啊,我明白了。它在緩衝區中。謝謝。 – user225312 2010-09-01 20:12:11

+0

是的,換行符告訴cin輸入已完成,但它也出現在緩衝區中。 – jdehaan 2010-09-01 20:15:10

0

你有什麼可吸收來自第一線的'\n'在獨立std::cin >> tries