2014-09-03 2 views
1

Я пытаюсь отобразить двоичную строку из шестнадцатеричной строки. мой код:преобразование из шестнадцатеричного в двоичный

#include <stdio.h> 
int main() { 
    char hexa[5], num[120]; 
    int i = 0, j, k, t; 
    char ch; 
    printf("enetr hexadecimal"); 
    while (ch = getchar() != '\n') { 
     scanf("%c", &ch); 
     hexa[i] = ch; 
     i++; 
    } 
    k = 0; 
    for (j = 0; hexa[j] != '\0'; j++) { 
     if (hexa[j] == 'A') { 
      num[k++] = '1'; 
      num[k++] = '0'; 
      num[k++] = '1'; 
      num[k++] = '0'; 
     } else if (hexa[j] == 'B') { 
      num[k++] = '1'; 
      num[k++] = '0'; 
      num[k++] = '1'; 
      num[k++] = '1'; 
     } else if (hexa[j] == 'C') { 
      num[k++] = '1'; 
      num[k++] = '1'; 
      num[k++] = '0'; 
      num[k++] = '0'; 
     } else if (hexa[j] == 'D') { 
      num[k++] = '1'; 
      num[k++] = '1'; 
      num[k++] = '0'; 
      num[k++] = '1'; 
     } else if (hexa[j] == 'E') { 
      num[k++] = '1'; 
      num[k++] = '1'; 
      num[k++] = '1'; 
      num[k++] = '0'; 
     } else if (hexa[j] == 'F') { 
      num[k++] = '1'; 
      num[k++] = '1'; 
      num[k++] = '1'; 
      num[k++] = '1'; 
     } else if (hexa[j] == '0') { 
      num[k++] = '0'; 
      num[k++] = '0'; 
      num[k++] = '0'; 
      num[k++] = '0'; 
     } else if (hexa[j] == '1') { 
      num[k++] = '0'; 
      num[k++] = '0'; 
      num[k++] = '0'; 
      num[k++] = '1'; 
     } else if (hexa[j] == '2') { 
      num[k++] = '0'; 
      num[k++] = '0'; 
      num[k++] = '1'; 
      num[k++] = '0'; 
     } else if (hexa[j] == '3') { 
      num[k++] = '0'; 
      num[k++] = '0'; 
      num[k++] = '1'; 
      num[k++] = '1'; 
     } else if (hexa[j] == '4') { 
      num[k++] = '0'; 
      num[k++] = '1'; 
      num[k++] = '0'; 
      num[k++] = '0'; 
     } else if (hexa[j] == '5') { 
      num[k++] = '0'; 
      num[k++] = '1'; 
      num[k++] = '0'; 
      num[k++] = '1'; 
     } else if (hexa[j] == '6') { 
      num[k++] = '0'; 
      num[k++] = '1'; 
      num[k++] = '1'; 
      num[k++] = '0'; 
     } else if (hexa[j] == '7') { 
      num[k++] = '0'; 
      num[k++] = '1'; 
      num[k++] = '1'; 
      num[k++] = '1'; 
     } else if (hexa[j] == '8') { 
      num[k++] = '1'; 
      num[k++] = '0'; 
      num[k++] = '0'; 
      num[k++] = '0'; 
     } else if (hexa[j] == '9') { 
      num[k++] = '1'; 
      num[k++] = '0'; 
      num[k++] = '0'; 
      num[k++] = '1'; 
     } 
    } 
    for (t = 0; num[t] != '\0'; t++) 
     printf("%c", num[t]); 
    return 0; 
} 

Этот фрагмент отображает только первый символ шестнадцатеричной строки, а не всю строку. пожалуйста, помогите в том, что вызывает ошибку, и помогите мне исправить то же самое.

+2

У вас есть несколько проблем с представленным кодом. Чтобы начать с ввода данных цикла, у вас нет каких-либо пограничных проверок, вы не проверяете, что вход действителен, условие eloop - это не то, что вы ожидаете от него (читайте о [приоритете оператора] (http://en.cppreference.com/w/c/language/operator_precedence)), и вы читаете два символа ввода в каждой итерации цикла. Затем в следующем цикле найдите ограничитель строки в массиве 'hexa', но вы фактически не добавляете его в массив. –

+0

И, наконец, с помощью ['fgets'] (http://en.cppreference.com/w/c/io/fgets) и [' strtol'] (http://en.cppreference.com/w/c/string/byte/strtol) вы можете легко обрезать код примерно до десяти строк или около того. –

+1

Не используйте 'scanf' внутри' while', вам это не нужно, оно избыточно. Вы уже читали символ с консоли с помощью 'getchar()' ... –

ответ

3

Вы (по какой-то причине) обрабатываете это как текст, что намного сложнее, чем делать это как фактические числа.

Вы могли бы уйти с чем-то вроде:

unsigned int hexa; 

if(scanf(" %x", &hexa) == 1) 
{ 
    int i; 
    for(i = (CHAR_BIT * sizeof hexa) - 1; i >= 0; --i) 
    { 
    putchar('0' + ((hexa & (1u << i)) != 0)); 
    } 
    putchar('\n'); 
} 

Значение выше всегда будет генерировать фиксированную (вероятно, 32-бит) ширину двоичном, вы можете сделать это по-другому, если вы действительно хотите переменную длину двоичное число.

0

Это будет работать для Вы-

# include <stdio.h> 
int main() 
{ 
     unsigned int num; 
     int i, j; 

     printf("Enter an Hex number\n"); 
     if(scanf(" %x", &num)!=1){ 
     printf("Enter proper Hexadecimal number\n"); 
     return 0; 
     } 
     printf("%x in binary format is- \n", num); 
     for (i = 31; i >= 0; i--) 
     { 
       if ((num>>i)&1) 
         printf("1"); 
       else 
         printf ("0"); 
     } 
     printf("\n"); 
     return 0; 
}