如何使用 sscanf 从字符串文字中提取 long unsigned int

How to extract a long unsigned int from a string literal using sscanf

我尝试将所有这些标志 ld lilusscanf 一起使用,但 none 有效。无论我在 buf 中输入什么数字,以下内容都会得到 4294967295

long unsigned data;
char buf[40] = "data 2349872764943587";

if (sscanf (buf, "data %lu", &data) == 1)
{
    printf ("%s\n", buf);
    printf ("data:\t%lu\n", data);
}

输出:

data 2349872764943587
data:   4294967295

我是否使用了错误的转换标志,或者我错过了什么?

您的数据类型 long unsigned 只能保证为 32 位大小,因此它可以容纳的最大值是您得到的 4294967295

改用 unsigned long long

看来,在您的情况下,unsigned long 占用 4 个字节,因此无法保存 2349872764943587,这需要超过 32 位才能存储。

您可以使用 unsigned long long(使用 sizeof 检查大小,需要为 8)或 uint64_t

为了便携,avoid using int, long, 等等。在你的平台,例如,long unsigned int 是32位,这就是你有问题的原因.

相反,#include <stdint.h> 使用标准类型,例如 int32_tint64_tuint32_tuint64_t。在您的特定情况下,uint64_t 可以解决问题。

要在 printfscanf 中使用 uint64_t data;,您需要 #include <inttypes.h> 然后 printf("%" PRIu64 "\n", data);

更多信息here

OP 的 unsigned long 似乎是 32 位,因此不能代表 51 位 2349872764943587

如果坚持使用缺少 64 位整数的编译器,代码可以使用 double,它通常可以处理 53 位整数值而不会丢失精度。

double data;
char buf[40] = "data 2349872764943587";

if (sscanf (buf, "data %lf", &data) == 1)
{
    printf ("%s\n", buf);
    printf ("data:\t%.0f\n", data);
}

输出

data:   2349872764943587