2014-11-02 1 views
-1

Например, если я набираю 101010101010, он должен равняться AAA, но он не работает. Он возвращает буквы только в том случае, если оно меньше двух букв за раз. Например, он работает, если я набираю «10101010». (Он возвращает АА). Пожалуйста помоги?C Программа для преобразования двоичных чисел в Hex не может преобразовать более двух двоичных чисел, если они равны шестнадцатеричным буквам

#include <stdio.h> 
#include <math.h> 
#include <string.h> 
void binary_hex(int n, char hex[]); 
int hex_binary(char hex[]); 

int main() 
{ 
    printf("Enter binary number: "); 
    scanf("%d",&n); 
    binary_hex(n,hex); 
    printf("Hexadecimal number: %s",hex); 
} 

void binary_hex(int n, char hex[]) /* Function to convert binary to hexadecimal. */ 
{ 
    int i=0,decimal=0, rem; 
    while (n!=0) 
    { 
     decimal += (n%10)*pow(2,i); 
     n/=10; 
     ++i; 
    } 

/* At this point, variable decimal contains binary number in decimal format. */ 
    i=0; 
    while (decimal!=0) 
    { 
     rem=decimal%16; 
     switch(rem) 
     { 
      case 10: 
       hex[i]='A'; 
       break; 
      case 11: 
       hex[i]='B'; 
       break; 
      case 12: 
       hex[i]='C'; 
       break; 
      case 13: 
       hex[i]='D'; 
       break; 
      case 14: 
       hex[i]='E'; 
       break; 
      case 15: 
       hex[i]='F'; 
       break; 
      default: 
       hex[i]=rem+'0'; 
       break; 
     } 
     ++i; 
     decimal/=16; 
    } 
    hex[i]='\0'; 
    strrev(hex);  /* Function to reverse string. */ 
} 
+1

Максимальное значение int32 - «2147483647». '2147483647' <' 101010101010' – BLUEPIXY

ответ

2

Вы не показали полную программу - n не объявлена ​​в любом объеме в main. Предполагая, что int n, ваша первая проблема здесь:

printf("Enter binary number: "); 
scanf("%d",&n); 

Вы читаете строку из единиц и нулей в качестве основы 10 (десятичного) числа. Вместо этого вы должны написать функцию, которая принимает const char * и итерации по каждому символу, проверяя, что это либо 1, либо 0, интерпретируя каждое значение и накапливая общее количество. Подсказка. Возможно, будет легче работать в порядке слева направо.

int parse_binary(const char *str) 
{ 
    int total = 0; 

    while (...) { 
     total += ... 
    } 

    return total; 
} 

Еще один намек: не изобретайте колесо. Конечно, кто-то хотел разобрать двоичные числа на C до вас, нет? Отъезд strtoul - а именно описание его третьего параметра.

Примечание. Обе вещи, о которых я упоминал, до сих пор ограничивают ваши двоичные значения до 32 бит (или 64, в зависимости от выбора типа данных). Если вам не нужны фактические значения целых чисел, конвертировать только строку из 1s и 0s в строку шестнадцатеричных значений (произвольной длины), тогда вы можете разбить проблему на еще более простые шаги.

Причина, по которой мы действительно хотим использовать шестнадцатеричный, состоит в том, что каждый символ в шестнадцатеричном значении представляет собой ровно один nibble, который составляет ровно четыре бита. Это означает, что каждая группа из четырех 1s или 0s соответствует ровно одному шестнадцатеричному символу. Предполагая, что ваш вход всегда кратен 4 символам в длину, вы можете легко обрабатывать произвольно длинную строку.

D E A D B E E F 
1101 1110 1010 1101 1011 1110 1110 1111 
+0

Джонатан, спасибо, я еще не очень хорошо программирую, но вижу, что вы говорите. Я ценю ваше время и помощь! – user3047983

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