我正在处理包含大量数字(磁盘偏移)的文件,并且在将scanf
用作%lli
时遇到了问题-数字的格式为0x
...但是scanf
无法读取所有位。
这里是示例代码(我在https://www.onlinegdb.com/online_c_compiler上进行了测试)。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* str = malloc(30);
unsigned long long l;
sprintf(str, "0x%llx\n", 0xffffffffffffffffULL);
printf("%s\n", str);
sscanf(str, "%lli", &l);
printf("%llx\n", l);
return 0;
}
它输出:
0xffffffffffffffff
7fffffffffffffff
而我希望两个数字相等。
如果使用%llx
说明符,它可以正常工作,但我不想将自己限制为十六进制格式的数字。
sscanf(str, "%lli", &l);
转换为每个strtoll
,这是signed转换。 sscanf("0xffffffffffffffff", "%lli", &l);
导致UB。
代替使用sscanf(str, "%llx", &l);
,它通过strtull()
进行无符号转换。它应该允许一个可选的前导"0x"