我试过了
sscanf(str, "%016llX", &int64 );
但似乎不安全。有没有一种快速安全的方法来进行类型转换?
谢谢~
最佳答案
不要打扰 scanf
系列中的函数。它们几乎不可能稳健地使用。这是 strtoull
的一般安全使用:
char *str, *end;
unsigned long long result;
errno = 0;
result = strtoull(str, &end, 16);
if (result == 0 && end == str) {
/* str was not a number */
} else if (result == ULLONG_MAX && errno) {
/* the value of str does not fit in unsigned long long */
} else if (*end) {
/* str began with a number but has junk left over at the end */
}
请注意,
strtoull
接受字符串上的可选 0x
前缀,以及可选的初始空格和符号字符( +
或 -
)。如果你想拒绝这些,你应该在调用 strtoull
之前执行测试,例如:if (!isxdigit(str[0]) || (str[1] && !isxdigit(str[1])))
如果您还希望禁止过长的数字表示(前导零),您可以在调用
strtoull
之前检查以下条件:if (str[0]=='0' && str[1])
要记住的另一件事是,“负数”不被考虑在转换范围之外;相反,
-
的前缀被视为与 C 中应用于无符号值的一元否定运算符相同,因此例如 strtoull("-2", 0, 16)
将返回 ULLONG_MAX-1
(不设置 errno
)。关于c - 如何以快速安全的方式将十六进制字符串转换为无符号 64 位(uint64_t)整数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4132318/