2011-07-29 36 views
0

這裏是我的問題:從「0x4000」(例如)字符串中獲取十六進制值並將其存儲在變量中。

如果字符串基於關閉「0X ####」格式的十六進制我寫了一個函數來檢測:

int lc3_hashex(char *str) 
{ 
    int val = 0;  
    char *to; 
    to = strndup(str+2, 10); 
    val = sscanf(to, "%x", &val); 
    if (val) 
    { 
     return val; 
    } 

    return 0; 
} 

假設參數的形式爲「 0x ####「,它返回後綴」0x「數字的十進制版本。但是有沒有內建的方式(或我只是監督的方式)獲得十六進制數字「0x4000」的整數值而不是整數值「4000」?

謝謝。

+0

'strndup'返回的字符串在完成使用後必須'free'd。 – Praetorian

+0

...我認爲@jonsca回答了這個問題 - 但在附註中,請確保釋放你分配的內存(C不像Java) - 即strdup mallocs內存,你需要釋放它而不是泄漏它。 – Soren

+0

有一個類似的討論,如果C++是一種可能性http://stackoverflow.com/questions/194465/how-to-parse-a-string-to-an-int-in-c'C'馬特的答案是好的。 –

回答

2

使用strtolstdlib.h,並指定基準爲16

唯一的缺點是,這個函數返回失敗時0,所以你要檢查,以確保輸入到它不爲0

6

您可以在功能減少:

int cnt = sscanf(str, "%x", &val); 
if (cnt == 1) { 
    // read a valid `0xNNNN` string 
} 

scanf%x格式已經做了進制轉換,並與0x前綴就好了交易。此外,它的返回值是匹配項的數量,因此您可以使用它來確定它是否在str中找到了十六進制值。

使用此功能,您可以獲得所需的兩種信息:字符串是否按照您的預期格式化,以及它的值(正確轉換)。它還避免了字符串分配(你沒有釋放)以及你的代碼在strlen(str)小於2時的錯誤。

如果你改變你的函數簽名:

int check_and_get_hex(const char *str, int *val); 

(或類似的東西),相應地更新sscanf調用(通過val而不是&val),並返回(cnt == 1),你可以同時獲得了「這是一個有效的十六進制字符串「和一次性調用者的值。

1

我不明白爲什麼字符串在做sscanf之前被縮短。如果您希望將十六進制值中的字符串轉換爲十進制整數,則可以直接輸入。

#include<stdio.h> 
int main() 
{ 
    char sHex[7] = "0x2002"; 
    int nVal = 0; 
    sscanf(sHex, "%x", &nVal); 
    printf("%d", nVal); 
    return 0; 
} 

這將打印8194,十進制值爲0x2002。通過給"%x"指定sscanf,您將輸入字符串指定爲十六進制。所以,前面的「0x」很好。

相關問題