Leo*_*olo 4 c++ string stringstream
当我尝试从字符串中解析空白分隔的double值时,我发现了这种奇怪的行为,即以循环方式读出字符串.
这是程序:
stringstream ss;
string s("1 2 3 4");
double t;
list<double> lis;
for(int j=0; j!=10; ++j){
ss << s;
ss >> t;
lis.push_back(t);
}
for(auto e : lis){
cout << e << " ";
}
Run Code Online (Sandbox Code Playgroud)
这里输出:
1 2 3 41 2 3 41 2 3 41
Run Code Online (Sandbox Code Playgroud)
如果我追加尾随空间,s= "1 2 3 4 ";我得到
1 2 3 4 1 2 3 4 1 2
Run Code Online (Sandbox Code Playgroud)
现在问题:
1)如果我不知道字符串s中有多少条目,我如何读入列表中的所有条目?
2)operator<<我实际上是在打电话ss << s;?是否指定循环阅读?
3)我可以更好地解析吗?
谢谢!
这是固定代码(感谢timrau):
// declarations as before
ss << s;
while(ss >> t){
lis.push_back(t);
}
// output as before
Run Code Online (Sandbox Code Playgroud)
这会产生:
1 2 3 4
Run Code Online (Sandbox Code Playgroud)
如预期的.(在处理下一个输入之前,不要忘记清除你stringstream的ss.clear().)))
来自HeywoodFloyd的另一个有用的评论:One也可以使用boost/tokenizer来"拆分"字符串,请参阅这篇文章
你可以测试的返回值>>.
while (ss >> t) {
lis.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)
它没有指定循环阅读.它ss << s附加"1 2 3 4"到流的末尾.
在第一个循环之前:
""
Run Code Online (Sandbox Code Playgroud)
第一次之后ss << s:
"1 2 3 4"
Run Code Online (Sandbox Code Playgroud)
第一次之后ss >> t:
" 2 3 4"
Run Code Online (Sandbox Code Playgroud)
第二次之后ss << s:
" 2 3 41 2 3 4"
Run Code Online (Sandbox Code Playgroud)
然后很明显,1 2 3 41 2 3 41 2 3 41如果没有尾随空间,你会得到什么s.