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

时间:2016-01-20 13:31:43

标签: c long-integer scanf

我尝试将所有这些标记ld lilusscanf一起使用,但都没有效果。无论我在4294967295中输入的是什么号码,以下内容都会获得buf

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

我使用错误的转换标志还是我错过了什么?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您的数据类型long unsigned仅保证为32位,因此它可以容纳的最大值为4294967295,您将获得该值。

改为使用unsigned long long

答案 2 :(得分:1)

在您的情况下,unsigned long占用4个字节,因此无法保存2349872764943587,这需要存储更多的32位。

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

答案 3 :(得分:0)

可移植性,avoid using intlong等。例如,在您的平台中,long unsigned int为32位,这就是您遇到问题的原因。< / p>

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

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

更多信息here