簡體   English   中英

為什么sscanf%lx在64位環境中的任何第一個uint32_t都讀為“ 0”?

[英]Why does sscanf %lx read “0” for any first uint32_t on a 64-bit environment?

我有以下C代碼:

uint32_t a = 1, b = 2;
sscanf("0xbadf00d 0xdeadbeef", "%lx %lx", &a, &b);
printf("%lx %lx", a, b);

在使用gcc的64位Linux機器上,如果使用標志-m32進行編譯,則會得到正確的輸出: badf00d deadbeef ,但是默認情況下,我會得到奇怪的輸出0 deadbeef

第二種情況是怎么回事? 我使用的轉換說明符字符是否錯誤,或者沒有此編譯器標志,是否有辦法解決問題?

您正在使用l length修飾符,該修飾符用於unsigned long ,但在64位系統上uint32_t 並非 unsigned long,只有Windows例外。 沒有為uint32_t定義標准的長度修飾符,但標頭中包含包含長度修飾符的宏(通常為空字符串)。

可移植的解決方案是使用<inttypes.h>定義的宏:

#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>

int main() {
    uint32_t a = 1, b = 2;
    sscanf("0xbadf00d 0xdeadbeef", "%" SCNx32 " %" SCNx32, &a, &b);
    printf("%" PRIx32 " %" PRIx32, a, b);
}

在幾乎所有實際使用的系統上,宏擴展后的含義與以下相同:

#include <stdint.h>
#include <stdio.h>

int main() {
    uint32_t a = 1, b = 2;
    sscanf("0xbadf00d 0xdeadbeef", "%x %x", &a, &b);
    printf("%x %x", a, b);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM