2013-11-14 3 views
0

Имея этот кусок кода:Преобразовать символ с = «а» в целое значение = 10

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

Если c является «:» Я хочу, чтобы стать hex 10. Если c имеет «F», hex должен 15. Я знаю, как выполнить эту задачу для целых чисел (с c - '0', хотя это нахмурилось) или со строками (с использованием sprintf или strtol), но я не знаю, как выполнить эту простую задачу в целом.

+1

Если с имеет «4», я думаю, что вы хотите шестнадцатеричный хранить 4 Или вы хотите двоичным:? «100» –

+0

Кроме того, Каков диапазон c? Вы хотите, чтобы это было 'char' или' uchar'? Я думаю, вы хотите перейти от 0 до 256, и это будет 'uchar'. –

+0

Я не вижу как символ 4 отображает Hex 10? Hex 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

Поскольку ОП упоминает «шестнадцатеричный», вы, вероятно, хотели бы ограничить сравнение «A» через «F», а не «Z». С этим ограничением получается, что полученный код даже переносится на EBCDIC, обычное проклятие арифметики на символьные константы. – RBerteig

+0

ok; обновленный ответ – ensc

+0

Ответ вы действительно, но я могу выбрать его, я предпочитаю другой ответ, потому что читаемость и компактность – MABC

Смежные вопросы