如何使用 sscanf 从字符串文字中提取 long unsigned int
How to extract a long unsigned int from a string literal using sscanf
我尝试将所有这些标志 ld
li
和 lu
与 sscanf
一起使用,但 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_t
、int64_t
、uint32_t
、uint64_t
。在您的特定情况下,uint64_t
可以解决问题。
要在 printf
和 scanf
中使用 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
我尝试将所有这些标志 ld
li
和 lu
与 sscanf
一起使用,但 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_t
、int64_t
、uint32_t
、uint64_t
。在您的特定情况下,uint64_t
可以解决问题。
要在 printf
和 scanf
中使用 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