C++ Stringstream:接受一个字符串,但不接受变量中存储的字符串。为什么?
我一直在试图将输入字符串拆分成由空格描述的更小的字符串。我发现这个代码here:C++ 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问题,但问题是我并不真正知道我在找什么。
您的问题不是stringstream ss (userInput);
,这是std::cin
的行为。任何空格将终止提取格式化的用户输入,因此输入bla bla
将导致一个std::string s = "bla"
和另一个字符串"bla"
等待提取。
改为使用
如果您想获得一条线,请改用cin >> noskipws >> userInput;
。
std::getline(std::cin,userInput)
。看看这个小demonstration,这对您输入bla bla
比较std::getline
到std::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"
参见:
-
std::getline
从<string>
( alternative resource)。 -
noskipws
-
istream::operator>>
你先生/女士,是天赐之物。非常感谢。 – user1258934 2012-03-09 09:47:21
@ user1258934 AAAhhhh我正在测试“blabla”,而不是“bla bla”,这就是它工作的原因。 +1 – 2012-03-09 09:48:15
@ 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>
。请将其插入所需的方法。
关于堆栈溢出,最好是提供标准的C++,而不是微软化的C++('stdafx.h','_tmain','_TCHAR')... – 2012-03-09 09:46:21
@Chalesworth:我同意代码是否需要改变在不同的编译器上运行 - 但在这种情况下它不会(请参阅修改帖子)。我想发布一个我编译和测试的例子。 – 2012-03-09 09:59:44
请出示和初始化条件是'stringstream'“含有字符串的变量”的一个例子。 – Xeo 2012-03-09 09:31:43
适合我。 – 2012-03-09 09:39:38
看起来对我有用:http://ideone.com/1AvVV。 – 2012-03-09 09:42:24