将std :: string转换为整数时如何处理溢出/下溢?

时间:2013-02-19 15:23:42

标签: c++ types overflow

我正在尝试使用std::istringstream将数字 std :: string 转换为整数

std::istringstream convertor;

convertor.str(mystring);
convertor >> myint;

如果数字字符串超过(或低于)整数的限制,我想抛出异常,但我不知道最好的方法是什么。我想知道是否有特定于std :: istringstream或其他特别为此目的而做的东西,或者我是否必须使用脏(至少看起来很脏:) :) numeric_limits的方法?

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

std::istringstream convertor;
convertor.str(mystring);
if(!(convertor >> myint)) {
    thow std::invalid_argument();
}

应该注意,标准库中已经有这样的功能。 (C ++ 11)

it=std::stoi(my_string);

http://en.cppreference.com/w/cpp/string/basic_string/stol

此外可以说这是异常滥用,因为函数的前提条件是mystring应该表示一个整数值,如果这不是一个先决条件,那么它是函数正常流控制的一部分来处理不是的情况。

我可能会写:

std::pair<bool, int> try_to_int(const std::string& str);

或者boost :: optional在这里也可以正常工作

答案 1 :(得分:1)

如果您可以访问C ++ 11功能,请尝试std::stoi(my_string);

如果您没有,但可以访问boost库,请尝试:

std::string str("112211"); 
int x = 0;
try
{
    x = boost::lexical_cast<int>(str);
}
(catch boost::bad_lexical_cast&)
{
}

boost :: lexical cast定义(至少是一般情况),在内部使用istringstream(如果你为std::istream& operator>>覆盖your_type,你将能够阅读您的类型为lexical_cast<your_type>(string));

如果您无权访问boost,请自行滚动(此线程中的其他人已经指出如何设置iostreams以抛出异常)。

编辑:滚动自己:

template<typename T>
T lexical_cast<T>(const std::string & str)
{
    std::istringstream buffer(str);
    buffer.exceptions(std::istringstream::failbit);
    T retval;
    buffer >> retval;
    return retval;
}

您可以将此细分为不支持iostream io的值类型。

答案 2 :(得分:0)

感谢您的回答,我在我的问题评论中找到了解决方案:

std::istringstream convertor;

convertor.str("16");
convertor >> myint;
if (convertor.fail())
    std::cerr << "error" << std::endl;

或者,抛出异常:

std::istringstream convertor;

convertor.exceptions(std::istringstream::failbit);
convertor.str("16");
convertor >> myint;