簡體   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