2013-11-14 67 views
0

有這一段代碼:轉換炭C = 'a' 到int值= 10

int main(void) 
{ 
    char c; 
    int hex; 
    .... 
} 

c如果是 '一' 我想hex成爲10.如果c具有 'F',hex應是15.我知道如何完成這個任務整數(與c - '0'雖然這皺起了眉頭)或字符串(使用sprintfstrtol),但我不知道如何完成這個簡單的任務一般。

+1

如果c具有「4」,我想你想的十六進制存儲4還是你想二進制:??「100」 –

+0

此外, c的範圍是什麼?你想讓它成爲'char'還是'uchar'?我認爲你想從0到256,這將是一個'uchar'。 –

+0

我看不到如何將字符4映射到十六進制10?十進制10是(十進制)16。 – abelenky

回答

3

我想你的意思是如果那c == 'a',那麼hex = 10。 試試這個(假設c總是在['0'..'9']工會['a'..'f']

hex = (c >= 'a' ? c - 'a' + 10 : c - '0'); 
5
if (c >= '0' && c <= '9') 
    hex = c - '0'; 
else if (c >= 'a' && c <= 'z') 
    hex = c - 'a' + 10; 
else if (c >= 'A' && c <= 'Z') 
    hex = c - 'A' + 10; 
else 
    abort(); 

爲了趕上壞輸入,則可以添加

if (hex >= base) /* base would be e.g. 16 */ 
    abort(); 

,或者當base是固定的,則可以限制上限值(例如的代替c <= 'f'c <= 'z')。第一種方法更靈活並且允許例如較大的基數或轉換八進制數。

+0

由於OP提到「十六進制」,您可能想通過'F'而不是'Z'將比較限制爲'A'。有了這個限制,事實證明,所得到的代碼甚至可以移植到EBCDIC上,這是字符常量算術常見的麻煩。 – RBerteig

+0

好的;更新回答 – ensc

+0

你的回答是有效的,但我可以選擇一個,我更喜歡其他答案,因爲可讀性和緊湊性 – MABC