我尝试将所有这些标记ld
li
和lu
与sscanf
一起使用,但都没有效果。无论我在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
我使用错误的转换标志还是我错过了什么?
答案 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 int
,long
等。例如,在您的平台中,long unsigned int
为32位,这就是您遇到问题的原因。< / p>
相反,#include <stdint.h>
会使用标准类型,例如int32_t
,int64_t
,uint32_t
,uint64_t
。在您的特定情况下,uint64_t
可以解决问题。
要在uint64_t data;
和printf
中使用scanf
,您需要#include <inttypes.h>
然后printf("%" PRIu64 "\n", data);
更多信息here。