2013-11-23 2 views
0

Преобразование, которое я написал от шестнадцатеричного до десятичного числа, не работает. Я не уверен, какая часть ошибочна. Нужно ли мне делать -7 или что-то еще.Десятичная до шестнадцатеричной ошибки преобразования

int hex_to_dec(char hexnumber[]) 
{ 

int decimal = 0; //integer for the final decimal number 
    int bit; //integer representing numbers between 0-9 and letter a-f in hex number 
    //a char array containing the input hex number 

    int i=0,j=0; 

    //the integer i takes the length of the input array 
    i =strlen(hexnumber); 

    //while there is a next bit in the array 
    while(i!=0) 
    { 
    bit = hexnumber[j]; 

    //if the bit is a digit do the following 
    if(('0' <= bit && bit <= '9')) 
    { 
    decimal = decimal * 16; 
    decimal = decimal + (bit - '0'); 
    } 

    //if the bit is a letter do the following 
    if(('a' <= bit && bit <= 'z')) 
    { 
    decimal = decimal * 16; 
    decimal = decimal + (bit - '7'); 
    } 

    i--; 
    j++; 

    } 
if(('a' <= bit && bit <= 'z')) 
    { 
    decimal = decimal * 16; 
    decimal = decimal + (bit - '7'); 
    } 
    cout<<decimal; 
    return decimal; 
} 

Вышеупомянутый мой код для того же.

+0

Используйте отладчик. Напишите тест (ы). –

+0

Используйте стандартные функции, такие как 'isdigit' и' isalpha' вместо того, чтобы кататься самостоятельно. – chris

+0

Трюк «value-7» работает для «A..F» * после * вычитания «0» - по крайней мере в ASCII. Это говорит о том, что вы скопировали части своего кода из другого места - только не правильно. – usr2564301

ответ

2

Вместо

decimal = decimal + (bit - '7'); 

Try:

decimal = decimal + (bit - 'a' + 10); 

Это потому, что значение бита 'a' в base 16 означает десятичное значение 10 в base 10.

Кроме того, вы должны удалить этот дополнительный оператор вне цикла while.

if(('a' <= bit && bit <= 'z')) 
    { 
    decimal = decimal * 16; 
    decimal = decimal + (bit - '7'); 
    } 

Чтобы разместить заглавные буквы, просто добавьте другое условие if в ваш цикл while.

if(('A' <= bit && bit <= 'Z')) 
    { 
    decimal = decimal * 16; 
    decimal = decimal + (bit - 'A' + 10); 
    } 
+0

Спасибо абхишеку, но он все еще не работает для писем верхнего регистра. Можете ли вы, пожалуйста, помочь мне в этом. Спасибо! –

+0

@VineetJain См. Мой отредактированный ответ. –

+0

Я сделал это, давая мне тот же ответ со всеми входными значениями:/ –

1
int hex2dec(char hexnumber[]) 
{ 
    // get rid of ancient C code (should take a string in the first place most likely) 
    string hex = hexnumber; 

    // use c++ to do the work for us 
    return stoi(hex, nullptr, 16); 
} 
+0

Что такое nullptr ?? –

+0

@VineetJain Вкратце, это тип, который можно конвертировать в любой тип указателя и означает, что указатель не указывает на что-то. Перед ключевым словом nullptr люди будут использовать макрос NULL или просто поставить 0. Для получения более полного ответа: http://stackoverflow.com/questions/1282295/what-exactly-is-nullptr – user904963

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