2012-03-09 88 views
1

我一直在試圖將輸入字符串拆分成由空格描述的更小的字符串。我發現這個代碼hereC++ Stringstream:接受一個字符串,但不接受變量中存儲的字符串。爲什麼?

stringstream ss ("bla bla"); 
string s; 

while (getline(ss, s, ' ')) { 
cout << s << endl; 
} 

它工作得很好。但是,如果用包含字符串的變量替換「bla bla」:

string userInput; 
cin >> userInput; 

stringstream ss (userInput); 
string s; 

while (getline(ss, s, ' ')) { 
cout << s << endl; 
} 

只打印出第一個字/字符/字符串。這是爲什麼?有沒有辦法解決它?我瀏覽過一些stringstream問題,但問題是我並不真正知道我在找什麼。

+4

請出示和初始化條件是'stringstream'「含有字符串的變量」的一個例子。 – Xeo 2012-03-09 09:31:43

+0

適合我。 – 2012-03-09 09:39:38

+0

看起來對我有用:http://ideone.com/1AvVV。 – 2012-03-09 09:42:24

回答

8

您的問題不是stringstream ss (userInput);,這是std::cin的行爲。任何空格將終止提取格式化的用戶輸入,因此輸入bla bla將導致一個std::string s = "bla"和另一個字符串"bla"等待提取。

改爲使用 cin >> noskipws >> userInput;如果您想獲得一條線,請改用std::getline(std::cin,userInput)。看看這個小demonstration,這對您輸入bla bla比較std::getlinestd::cin::operator>>

來源:

#include <iostream> 
#include <string> 

int main(){ 
     std::string userInput; 

     std::cout << "Using std::getline(std::cin,userInput) on input \"bla bla\"." << std::endl; 
     std::getline(std::cin,userInput); 
     std::cout << "userInput contains \"" << userInput << "\"" << std::endl; 

     std::cout << "std::cin >> userInput on input \"bla bla\"." << std::endl; 
     std::cin >> userInput; 
     std::cout << "userInput contains \"" << userInput << "\"" << std::endl; 
     return 0; 
} 

結果:

Using std::getline(std::cin,userInput) on input "bla bla". 
userInput contains "bla bla" 
std::cin >> userInput on input "bla bla". 
userInput contains "bla"

參見:

+0

你先生/女士,是天賜之物。非常感謝。 – user1258934 2012-03-09 09:47:21

+0

@ user1258934 AAAhhhh我正在測試「blabla」,而不是「bla bla」,這就是它工作的原因。 +1 – 2012-03-09 09:48:15

+0

@ user1258934:我更新了我的答案,因爲我描述了行爲,但提供了一個沉悶的解決方案。我的意思是,來吧,'std :: noskipws'?如果沒有咖啡,我不應該回答任何問題:D ...但是我想你已經自己解決了其他問題('std :: getline')。 – Zeta 2012-03-10 08:43:27

0

這確實你說的話:

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

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::string test("bla bla"); 
    std::stringstream stream(test); 
    std::string temp; 
    while (getline(stream, temp, ' ')) { 
     std::cout << temp << std::endl; 
    } 
    return 0; 
} 

你說,即使你做了什麼是的。但是,因爲它的工作原理 - 你的代碼有什麼不同?

而對於那些沒有一個Microsoft Visual C++編譯器方便和不理解的差異是誰,這裏是一個代碼片段:

std::string test("bla bla"); 
std::stringstream stream(test); 
std::string temp; 
while (getline(stream, temp, ' ')) { 
    std::cout << temp << std::endl; 
} 

的包括由片斷要求是:<string><sstream> & <iostream>。請將其插入所需的方法。

+3

關於堆棧溢出,最好是提供標準的C++,而不是微軟化的C++('stdafx.h','_tmain','_TCHAR')... – 2012-03-09 09:46:21

+0

@Chalesworth:我同意代碼是否需要改變在不同的編譯器上運行 - 但在這種情況下它不會(請參閱修改帖子)。我想發佈一個我編譯和測試的例子。 – 2012-03-09 09:59:44

相關問題