意外的字符串流行为

lwx*_*ted 2 c++ iostream stringstream istream

请考虑以下代码:

#include <sstream>
#include <iostream>

using namespace std;

int main()
{
    stringstream ss;

    ss << string("12");
    int h;
    ss >> h;
    cout << h << endl;

    ss.str(string("")); // clear the content of ss

    ss << string("30");
    int m;
    ss >> m;
    cout << m << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行上面的代码会产生一些随机输出:

12
0
Run Code Online (Sandbox Code Playgroud)

在某些其他时间,观察到以下输出:

12
4
Run Code Online (Sandbox Code Playgroud)

我期望输出简单:

12 
30
Run Code Online (Sandbox Code Playgroud)

为什么我会得到意想不到的结果?

此外,string sint i没有必要的C++ 11支持的情况下解析一个to 的最佳方法是什么?应该是int i = atoi(s.c_str())吗?

Jos*_*eld 6

12从流中提取时,到达它的末尾,这会使其处于错误状态.任何进一步的提取都将失败.您需要在ss.clear()清除其内容时调用.

如果您检查了提取的成功,那么您可以避免这个问题.我通常希望从流中看到任何提取作为某种条件.

是的,使用字符串流将字符串解析为整数是在C++ 11之前完成它的一种非常合理的方法.我更喜欢使用它atoi.对于任何想要了解C++ 11方式的人,请使用std :: stoi.