如何从字符串中获得无符号长整数?

Dan*_*ham 5 c++ unsigned string-conversion string-parsing long-integer

在C++中从字符串中检索unsigned long的最安全和最好的方法是什么?

我知道一些可能的方法.

首先,转换从atol获取的签名长.

char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
Run Code Online (Sandbox Code Playgroud)

这个问题的一个明显问题是,当myStr中存储的值大于signed long可以包含的值时会发生什么?atol检索什么?

下一个可能性是使用strtoul.

char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
Run Code Online (Sandbox Code Playgroud)

但是,这对我的需求来说有点复杂.我想要一个简单的函数,字符串输入,unsigned long base 10 out.此外,错误处理还有很多不足之处.

我发现的最后一种可能性是使用sscanf.

char *myStr; // Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
    //do some error handling
}
Run Code Online (Sandbox Code Playgroud)

同样,错误处理还有很多不足之处,而且比我想要的要复杂得多.

剩下的显而易见的选择是编写我自己的一个包装器,围绕一个先前的可能性或一些循环通过字符串并手动转换每个数字直到它达到ULONG_MAX.

我的问题是,我的google-fu未能找到的其他选项是什么?C++ std库中的任何东西都会将字符串干净地转换为unsigned long并在失败时抛出异常?

如果这是一个骗局,我道歉,但我找不到任何与我完全匹配的问题.

Meh*_*ari 5

一种方法:

stringstream(str) >> ulongVariable;
Run Code Online (Sandbox Code Playgroud)


Pat*_*ola 5

你可以毫无问题地使用strtoul.该函数返回unsigned long.如果无法执行转换,则函数返回0.如果正确的long值超出范围,则函数返回ULONG_MAX,并将errno全局变量设置为ERANGE.