簡體   English   中英

為什么 sscanf 在這種情況下會導致 0 ?

[英]Why does sscanf result in 0 in this case?

我正在嘗試將一系列十進制數字轉換為字符串格式的十六進制表示,然后從字符串轉換回十進制。 這可能聽起來很奇怪,但它是更復雜情況的簡化表示。 因此,無論哪種方式,我都有以下幾乎可以正常工作的代碼。 出於某種原因,我的變量 a 最后仍然等於 0,而它應該等於 43,所有其他變量似乎都沒問題:

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    /********************* A *******************/
    uint16_t a = 43;   //0x002b 
    int16_t  b = -43;  //0xffd5
    uint32_t c = 234;  //0x000000ea
    int32_t d = -234;  //0xffffff16

    char aStr[10]={0};
    char bStr[10]={0};
    char cStr[10]={0};
    char dStr[10]={0};

    snprintf(aStr, sizeof(aStr), "%04hhx", a);
    snprintf(bStr, sizeof(bStr), "%04x", b & 0xFFFF);
    snprintf(cStr, sizeof(cStr), "%08hhx", c);
    snprintf(dStr, sizeof(aStr), "%08x", d & 0xFFFFFFFF);

    fprintf(stdout, "TX a = %s.\n", aStr);
    fprintf(stdout, "TX b = %s.\n", bStr);
    fprintf(stdout, "TX c = %s.\n", cStr);
    fprintf(stdout, "TX d = %s.\n", dStr);

    /********************* B *******************/

    uint16_t aOut = 0;
    int16_t bOut = 0;
    uint32_t cOut = 0;
    int32_t dOut = 0;

    sscanf(aStr, "%04hhx", &aOut);
    sscanf(bStr, "%04x", &bOut);
    sscanf(cStr, "%08hhx", &cOut);
    sscanf(dStr, "%08x", &dOut);

    fprintf(stdout, "rx a = %d\n", aOut);  //<---- this line prints 0 for a. Why?
    fprintf(stdout, "rx b = %d\n", bOut);
    fprintf(stdout, "rx c = %d\n", cOut);
    fprintf(stdout, "rx d = %d\n", dOut);

    return 0;
}

有誰知道為什么或我錯過了什么?

sscanf(aStr, "%04hhx", &aOut);

是錯的。 %hhx轉換格式說明符需要一個類型為unsigned char *的參數,但您改為傳遞一個類型為uint16_t *的參數。 這會調用未定義的行為。

我建議您將該行更改為以下內容:

sscanf(aStr, "%04"SCNx16, &aOut);

在大多數平台上,宏SCNx16將簡單地擴展為"hx" ,但使用宏通常更安全,以防您的代碼碰巧在uint16_t不等於unsigned short的(未來)平台上運行。

線條

sscanf(bStr, "%04x", &bOut);
sscanf(cStr, "%08hhx", &cOut);
sscanf(dStr, "%08x", &dOut);

也使用了錯誤的轉換格式說明符。 我建議您改用以下代碼:

sscanf(bStr, "%04"SCNx16, &bOut);
sscanf(cStr, "%08"SCNx32, &cOut);
sscanf(dStr, "%08"SCNx32, &dOut);

嚴格來說,上面的代碼也調用了未定義的行為,因為%x轉換格式說明符需要一個指向unsigned類型而不是有signed類型的指針。 但是,這在實踐中應該不是問題,前提是轉換后的值可以用有signed類型和unsigned類型表示。

暫無
暫無

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

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