C++ Stringstream:接受一个字符串,但不接受变量中存储的字符串。为什么?

问题描述:

我一直在试图将输入字符串拆分成由空格描述的更小的字符串。我发现这个代码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

您的问题不是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

这确实你说的话:

#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