我一直在尝试将输入字符串拆分为由空格描绘的较小字符串。我从here找到了这段代码:
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;
}
只输出第一个单词/ char / string。这是为什么?有办法解决吗?我已经查看了一些字符串流问题,但问题是我真的不知道我在寻找什么。
答案 0 :(得分:8)
您的问题不是stringstream ss (userInput);
,而是std::cin
的行为。任何空格都将结束格式化用户输入的提取,因此输入bla bla
将导致一个 std::string s = "bla"
和另一个字符串"bla"
等待提取。
改为使用如果您想获得一行,请改用cin >> noskipws >> userInput;
。std::getline(std::cin,userInput)
。看看这个小demonstration,它会在您的输入std::getline
上对std::cin::operator>>
到bla bla
进行比较:
来源:
#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"
另见:
std::getline
来自<string>
(alternative resource)。noskipws
istream::operator>>
击> 答案 1 :(得分: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>
&amp; <iostream>
。请将其插入所需的方法。