如何在C++中安全且最佳地从字符串中检索无符号长整型?
我知道有很多可能的方法。
首先是将从atol获取的有符号长整型转换为无符号长整型。
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
显而易见的问题是,当myStr中存储的值大于有符号长整型所能容纳的值时会发生什么?atol检索到什么?
下一个可能性是使用strtoul。
char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
然而,这对我的需求来说有点过于复杂了。我需要一个简单的函数,输入字符串,输出十进制无符号长整型。此外,错误处理也有待改善。
我找到的最后一个可能性是使用sscanf。
char *myStr; // Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
//do some error handling
}
再次强调,错误处理还有很大的提升空间,而且比我想象中要复杂一些。
剩下的明显选项是编写自己的代码,可以是对之前某个选项的包装器,也可以是手动循环遍历字符串并将每个数字手动转换,直到达到ULONG_MAX。
我的问题是,除了我谷歌搜索失败的选项外,还有其他的选项吗?C++ std 库中是否有干净地将字符串转换为无符号长整型并在出现错误时抛出异常的函数?
如果这是重复问题,我深感抱歉,但我找不到与我的问题完全匹配的问题。
atol
: "如果正确的值超出了可表示的范围,则返回LONG_MAX或LONG_MIN。" http://www.cplusplus.com/reference/clibrary/cstdlib/atol/ - Mark Rushakoff