繁体   English   中英

重新使用stringstream对象的问题

[英]Problem with re-using a stringstream object

我正在尝试使用安全实践来处理仅在C ++中使用数字的输入,所以我使用stringstream对象:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    int first, second;
    string input;

    stringstream sstream;

    cout << "First integer: ";
    getline(cin, input);
    sstream.str(input);
    sstream >> first;

    cout << first << endl; //display user input in integers

    cout << "Second integer: ";
    getline(cin, input);
    sstream.str(input);
    sstream >> second;

    cout << second << endl; //display user input in integers

    getline(cin, input); //pause program

    return 0;
}

然而,第二次它似乎给变量'second'一个任意值。 这是输出:

First integer: 1
1
Second integer: 2
2293592

如果我声明两个stringstream对象并分别对它们使用它们,它似乎工作正常。 这是否意味着我不能以我正在尝试的方式重用stringstream对象? 在我的真实程序中,我打算处理来自用户的两个以上输入值,所以我只想确定是否有另一种方式而不是制作多个stringstream对象。 我怀疑这是非常重要的,但我在Windows XP上,我使用MinGW作为我的编译器。

我非常感谢任何帮助。

使用sstream.clear(); sstream >> first;之后sstream >> first;

您需要重置stringstream的状态。 通常,这涉及两个步骤:清除缓冲区:

sstream.str("");

并重置错误状态标志:

sstream.clear();

如果你没有清除缓冲区,如果你得到像“123abc”这样的输入,那么当你下次尝试从它读取时,“abc”仍将在流中。

您还应确保测试流的失败状态( sstream.fail() )以确保提取成功。 如果你想确保用户只输入一个整数(即,你想阻止用户输入,比如说“123abc”,那么你应该测试以确保sstream.eof()为真。

在数据类型之间进行此转换的更好方法是使用boost::lexical_cast

可以在Boost站点找到信息和示例。

下面是一个执行int到字符串转换和返回(字符串到int)的示例,例如您在程序中执行的操作。

#include <string>
#include <boost/lexcal_cast.hpp>

int main(int argc, char *argv[])
{
    int i = 42;
    std::string s = boost::lexical_cast<std::string>(i);
    int j = boost::lexical_cast<int>(s);

    return 1;
}
cout << "First integer: ";
getline(cin, input);
sstream.str(input);
sstream >> first;     // state of sstream may be eof

cout << "Second integer: ";
getline(cin, input);
sstream.str(input);
sstream.clear();      // clear eof state
sstream >> second;    // input from sstream

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM