我使用std::istringstream
解析字符串已经很长时间了,读取有效值从来都不是问题。但是,我发现执行一些本应无效并检测到故障的操作会遇到一些困难和奇怪之处。
查看代码(或try it on Ideone):
#include <iostream>
#include <sstream>
#include <stdint.h>
int main() {
std::istringstream ss("-2147483648");
uint32_t i = 0;
try {ss >> i;}
catch (...) {
i = -3;
}
if (ss.fail())
i = -3;
std::cout << i;
return 0;
}
我正在尝试将INT_MIN
(一个带符号的值)读入uint32_t
。我预计会出现某种失败,如魔术值-3
所示。但是,我在输出中看到的是2147483648
。在这种情况下如何正确检测故障?
如果i
是uint64_t
,则其值为18446744071562067968
。
我需要此调用失败,因为我不需要我的代码静默地读取垃圾。 std::stringstream
是否可以实现我的目标?我不想从头开始实现我自己的解析器,或者将简单的ss >> value;
包装在十几种健全性检查启发式方法中。