2013-11-14 68 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