我正在尝试使用std::istringstream
将数字 std :: string 转换为整数
std::istringstream convertor;
convertor.str(mystring);
convertor >> myint;
如果数字字符串超过(或低于)整数的限制,我想抛出异常,但我不知道最好的方法是什么。我想知道是否有特定于std :: istringstream或其他特别为此目的而做的东西,或者我是否必须使用脏(至少看起来很脏:) :) numeric_limits
的方法?
感谢您的帮助。
答案 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;