[英]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.