RAJESH1601105065 Ответов: 4

Почему следующий код не выводит двоичное число соответствующего шестнадцатеричного числа?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
  int n,r;
  char k;
  char binary[100]=" ";

    printf("ENTER THE NUMBER IN HEXADECIMAL\n");
    scanf("%d",&n);
    while(n!=0)
    {
        r=n%10;
        k=(char)r;
        switch(k)
        {
            case '0':
                strcat(binary,"0000");
                break;
            case '1':
                strcat(binary,"0001");
                break;
            case '2':
                strcat(binary,"0010");
                break;
            case '3':
                strcat(binary,"0011");
                break;
            case '4':
                strcat(binary,"0100");
                break;
            case '5':
                strcat(binary,"0101");
                break;
            case '6':
                strcat(binary,"0110");
                break;
            case '7':
                strcat(binary,"0111");
                break;
            case '8':
                strcat(binary,"1000");
                break;
            case '9':
                strcat(binary,"1001");
                break;
            case 'a':
                case 'A':
                    strcat(binary,"1010");
                    break;
            case 'b':
                case 'B':
                    strcat(binary,"1011");
                    break;
            case 'c':
                case 'C':
                    strcat(binary,"1100");
                    break;
            case 'd':
                case 'D':
                    strcat(binary,"1101");
                    break;
            case 'e':
                case 'E':
                    strcat(binary,"1110");
                    break;
            case 'f':
                case 'F':
                    strcat(binary,"1111");
                    break;
        }
        n=n/10;
    }
    strrev(binary);
    printf("%s",binary);
    return 0;
}


Что я уже пробовал:

я пытаюсь вывести двоичный код шестнадцатеричного числа.

4 Ответов

Рейтинг:
2

Rick York

Я предпочитаю "отклеивать" кусочки. Вот функция, которая делает некоторый сдвиг битов, чтобы получить двоичную строку для одного байта, и она вставляет пробел между двумя кусочками.

typedef unsigned char UCHAR;

void GenerateBinaryString( UCHAR byt, char * buffer )
{
   int n = 0;
   char * appendstr = nullptr;
   UCHAR mask = 0;

   * buffer = 0;
   for( n = 0; n < 8; ++n )
   {
       mask = 1 << ( 7 - n );
       appendstr = ( byt & mask ) ? "1" : "0";
       strcat( buffer, appendstr );
       if( n == 3 )
           strcat( buffer, " " );  // insert a space between nibbles
   }
}
Затем вы вызываете его для каждого байта данных, которые у вас есть. С помощью цикла можно обрабатывать данные любого размера.

Вот функция для проверки этого. Он отображает десятичные, шестнадцатеричные и двоичные значения чисел от 0 до 255.
void TestBinaryStrings()
{
    char buffer[ 16 ] = { 0 };
    for( int n = 0; n < 256; ++n )
    {
        GenerateBinaryString( (UCHAR) n, buffer );
        printf( "%3d = 0x%02X = %s\n", n, n, buffer );
    }
}
В моих тестах результаты такие, как и ожидалось.


Рейтинг:
1

OriginalGriff

Много причин!

1) потому что вы извлекаете цифры в неправильном порядке.
Если я введу "1a3", то ваш цикл сначала извлечет "3", затем "a", а затем "1".
Вам нужно сначала работать с самой значащей цифрой, а не с самой маленькой, или перевернуть вывод, прежде чем печатать его.
Подсказка: если вы работаете с конца binary вместо фронта он мог бы работать лучше.

2) потому что оператор "%" возвращает целое число, а не символ.
3 в целочисленном значении-это не то же самое, что '3' символьное значение, и когда вы приводите целое число к значению char, оно не изменяет его: оно оставляет его как значение 3 в переменной char. Это не то же самое, что "3" , который имеет значение 0x33: ASCII - Википедия[^]
3 значение в символе-это то, что называется "управляющим кодом", называемым "ETX", и оно=s используется для "кадрирования" данных.
Подсказка: удалите цитаты из ваших случаев и повторите попытку:

            case 0:
                strcat(binary,"0000");
                break;
            case 1:
                strcat(binary,"0001");
                break;
...
Вам нужно будет что-то сделать с " а " до "Ф", но я оставлю это вам.
Предложение: Всегда добавить default К switch поэтому сделайте что-нибудь разумное, когда вы получаете значение, которое вы не разрешили: распечатайте его с сообщением об ошибке, например r.

3) потому что x % 10 он не дает вам шестнадцатеричную цифру: он дает вам десятичную цифру. Также, x / 10 отбрасывает не шестнадцатеричную цифру, а десятичную.
Подсказка: попробуйте использовать 16 вместо 10 или извлечь шестнадцатеричную цифру, добавив ее 0x0f.

4) потому что scanf("%d", ...) не читает шестнадцатеричное число: строка формата scanf - Википедия[^]
Подсказка: нет никакого кода формата для "чтения шестнадцатеричного числа": либо прочитайте десятичное число и преобразуйте его в двоичное, либо прочитайте строку и проверьте ее перед преобразованием в числовое значение.

Честно говоря, вы должны были заметить большинство из них довольно быстро для себя: если бы вы использовали отладчик, чтобы увидеть, что происходит, вам было бы легче.
Я настоятельно рекомендую вам научиться использовать отладчик в вашей системе - он может позволить вам просматривать и контролировать ваш код во время его выполнения, включая изучение и изменение значений переменных. Это самый мощный инструмент, который у вас есть, и вы, вероятно, потратите больше времени на тестирование и исправление своего кода, чем на его написание!

Если вы не знаете, как использовать отладчик, то Google поможет - найдите Название вашей IDE и "отладчик", и вы найдете массу информации!


Рейтинг:
1

CPallini

Вы можете выполнить эти требования, используя только строки (то есть массив символов). Попробуй

#include <stdio.h>
#include <string.h>

int main()
{
  const size_t HEX_DIGITS = 8;
  const size_t BIN_DIGITS = HEX_DIGITS * 4;
  int hex_index;
  int bin_index;
  int is_hex_digit;

  char hex[HEX_DIGITS+1];
  char bin[BIN_DIGITS+1];
  printf("please enter the hexadecimal representation of the number\n");
  fgets(hex, sizeof(hex), stdin);

  for (bin[0] = '\0', hex_index = 0, bin_index = 0, is_hex_digit = 1; is_hex_digit; ++hex_index, bin_index+=4)
  {
    switch( hex[hex_index] )
    {
    case '0':
      strcat(&bin[bin_index], "0000");
      break;
    case '1':
      strcat(&bin[bin_index], "0001");
      break;
    case '2':
      strcat(&bin[bin_index], "0010");
      break;
    case '3':
      strcat(&bin[bin_index], "0011");
      break;
    case '4':
      strcat(&bin[bin_index], "0100");
      break;
    case '5':
      strcat(&bin[bin_index], "0101");
      break;
    case '6':
      strcat(&bin[bin_index], "0110");
      break;
    case '7':
      strcat(&bin[bin_index], "0111");
      break;
    case '8':
      strcat(&bin[bin_index], "1000");
      break;
    case '9':
      strcat(&bin[bin_index], "1001");
      break;
    case 'A':
    case 'a':
      strcat(&bin[bin_index], "1010");
      break;
    case 'B':
    case 'b':
      strcat(&bin[bin_index], "1011");
      break;
    case 'C':
    case 'c':
      strcat(&bin[bin_index], "1100");
      break;
    case 'D':
    case 'd':
      strcat(&bin[bin_index], "1101");
      break;
    case 'E':
    case 'e':
      strcat(&bin[bin_index], "1110");
      break;
    case 'F':
    case 'f':
      strcat(&bin[bin_index], "1111");
      break;
    default:
      is_hex_digit = 0;
      break;
    }
  }
  printf("binary representation is  %s\n", bin);
  return 0;
}


Рейтинг:
1

Patrice T

r=n%10;

Шестнадцатеричное означает основание 16, а не 10.
k=(char)r;

Это говорит о том, что k-это символ с ascii-кодом r, он не выполняет никакого преобразования в ожидаемый символ, потому что вы не просили о преобразовании.
Попробуйте с помощью
switch(r)
{
    case 0:
        strcat(binary,"0000");
        break;
    case 1:
        strcat(binary,"0001");
        break;

Цитата:
Почему следующий код не выводит двоичное число соответствующего шестнадцатеричного числа?

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.