无法正确扫描〜0ULL

问题描述 投票:1回答:1

我正在处理包含大量数字(磁盘偏移)的文件,并且在将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说明符,它可以正常工作,但我不想将自己限制为十六进制格式的数字。

c scanf unsigned unsigned-integer
1个回答
0
投票

sscanf(str, "%lli", &l);转换为每个strtoll,这是signed转换。 sscanf("0xffffffffffffffff", "%lli", &l);导致UB。

代替使用sscanf(str, "%llx", &l);,它通过strtull()进行无符号转换。它应该允许一个可选的前导"0x"

© www.soinside.com 2019 - 2024. All rights reserved.