C11 7.22.1.4p8:
、strtol
、strtoll
和函数返回转换strtoul
后strtoull
的值(如果有)。如果无法执行转换,则返回零。如果正确的值在可表示值的范围之外,LONG_MIN
, LONG_MAX
, LLONG_MIN
, LLONG_MAX
, ULONG_MAX
, 或被ULLONG_MAX
返回(根据返回类型和值的符号,如果有的话),宏的值ERANGE
存储在errno
.
试试下面的代码:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char str1[] = "88CC6069E4EDF969773369F988CC969F";
errno = 0; // must reset errno first, otherwise it can retain an old value
unsigned long int hex_int = strtoul(str1, NULL, 16);
if (errno != 0) {
perror("strtoul failed:");
}
}
在我的机器上它会输出
strtoul failed: Numerical result out of range
你犯了两个错误:返回的值strtoul
是一个unsigned
long
;即使这样,您的值也是 128 位,比unsigned long
任何常见平台上的值都大。
而且,不要限制str1
- 它应该至少是 33 个字符的长度;或改用指向字符的指针:
char *str1 = "88CC6069E4EDF969773369F988CC969F";
并且,int main(void)
。