【发布时间】:2010-12-01 19:58:42
【问题描述】:
在 C++ 中从字符串中检索无符号长整数的最安全和最好的方法是什么?
我知道许多可能的方法。
首先,转换取自 atol 的有符号长整数。
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
这个明显的问题是,当存储在 myStr 中的值大于有符号的 long 可以包含的值时会发生什么? atol 检索什么?
下一个可能是使用 strtoul。
char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
但是,这对于我的需求来说有点过于复杂了。我想要一个简单的函数,字符串输入,无符号长基数 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。
我的问题是,我的 google-fu 找不到的其他选项是什么? C++ std 库中的任何东西都可以将字符串干净地转换为无符号长整数并在失败时抛出异常?
如果这是一个骗局,我深表歉意,但我找不到任何与我完全匹配的问题。
【问题讨论】:
-
atol: "如果正确值超出可表示值的范围,则返回 LONG_MAX 或 LONG_MIN。" cplusplus.com/reference/clibrary/cstdlib/atol -
几个问题,我不确定它们是否重复:(1)stackoverflow.com/questions/1243428/…(2)stackoverflow.com/questions/1435253/…
-
我不明白你对 strtoul 有什么看法。这是完美的功能。为 base 传递一个 0,它将使用 C 库理解的任何基本前缀字符串转换数字,例如“0x”。
标签: c++ long-integer unsigned string-parsing string-conversion