2

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

std::istringstream convertor;

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

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

感谢您的帮助。

4

3 回答 3

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

于 2013-02-19T15:27:35.763 回答
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 转换(至少对于一般情况),以在istringstream内部使用(如果您覆盖std::istream& operator>>for your_type,您将能够使用 读取您的类型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 的值类型,您可以具体说明这一点。

于 2013-02-19T15:38:20.223 回答
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;
于 2013-02-19T18:00:16.797 回答