将std::string转换为integer时,如何处理上溢/下溢

How do I handle overflow / underflow when converting std::string to integer?

本文关键字:处理 下溢 何处理 转换 string std integer      更新时间:2023-10-16

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

std::istringstream convertor;
convertor.str(mystring);
convertor >> myint;

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

谢谢你的帮助。

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在这里也能很好地工作

如果您可以访问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::定义了词法转换(至少对于一般情况),以便在内部使用istringstream(如果将your_type重写为std::istream& operator>>,则可以使用lexical_cast<your_type>(string)读取类型);

如果您也没有boost的访问权限,请滚动您自己的(本线程中的其他人已经指出了如何设置iostream以抛出异常)。

编辑:滚动自己的:

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的值类型指定此项。

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

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;