将std::string转换为integer时,如何处理上溢/下溢
How do I handle overflow / underflow when converting std::string to integer?
我正在尝试使用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;
- 自定义 std::fstream,std::filebuf 的溢出和下溢函数未为每个字符调用
- 带有剪裁下溢的夏亚减法
- 使用 size_t 初始化循环变量时的整数下溢
- 无锁队列实现中的虚假下溢C++
- 在减法期间将 C++ 转换为字节 (unit8_t) 不会像我预期的那样强制下溢;输出int16_t;为什么?
- C++长 int 溢出/下溢
- 上溢/下溢是执行时未定义的行为吗
- C++ 在将字符串提取到标量时处理溢出/下溢
- C/FORTRAN将双下溢设置为零
- basic_streambuf炒锅的功能溢出和下溢如何
- 为什么C++下溢/溢出行为被视为未定义
- C++下溢和溢出
- 渐变下溢程序的表示
- 指针下溢或溢出时会发生什么情况
- 溢流/下溢问题
- 如何在C语言中检测浮点下溢
- 如何检测双精度浮点溢出和下溢
- 未签名的下溢机制
- 编译器构造-如何在C++中发生堆栈下溢
- 将std::string转换为integer时,如何处理上溢/下溢