繁体   English   中英

如何使用sscanf从字符串文字中提取长整型unsigned int

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

我尝试将所有这些标志ld lilusscanf一起使用,但没有一个起作用。 无论我在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

我使用了错误的转换标志还是错过了某些东西?

OP的unsigned long 2349872764943587似乎是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

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

请改用unsigned long long

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

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

为了实现可移植性,请避免使用 intlong等。例如,在您的平台中, long unsigned int是32位,这就是您遇到问题的原因。

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

使用uint64_t data; printfscanf ,需要先#include <inttypes.h> ,然后再进行printf("%" PRIu64 "\\n", data);

更多信息在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM