Мусор распечатывается при вводе числа больше 127 - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь написать программу, которая выводит десятичное число в виде двоичного числа. Если я введу число больше 127, мусор будет распечатан. Как исправить эту ошибку?

Проблема появляется в следующей строке:

printf("%s\n", bits);

Возможно, функция print_decimal_number_binary (int) неверна. Я знаю, что на самом деле я должен обратить двоичную строку, прежде чем распечатать ее, я буду реализовывать это после исправления ошибки.

Большое спасибо за полезные комментарии!

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 1

void print_decimal_number_binary(int number)
{
    char bits[sizeof(int) * 8 + 1];
    int index = 0;

    if (number == 0)
    {
        printf("0\n");
        return;
    }

    while (number > 0)
    {
        if (number % 2 == 0)
        {
            bits[index] = '0';
        }
        else
        {
            bits[index] = '1';
        }
        number = number / 2;
        index++;
    }

    printf("%s\n", bits);
}

int main(void) 
{
    printf("This program only works for positive integers.\n\n");
    while (TRUE)
    {
        // display main menue and get choice
        printf("[1] decimal to binary\n");
        printf("[2] binary to decimal\n");
        printf("[0] leave program\n");
        printf("Input: ");
        char main_menue_choice;
        fflush(stdin);
        scanf(" %c", &main_menue_choice);
        printf("\n");

        // handle user input
        if (main_menue_choice == '1')
        {
            printf("number: ");
            int number;
            fflush(stdin);
            scanf(" %i", &number);
            printf("\n");
            print_decimal_number_binary(number);
        }
        else if (main_menue_choice == '2')
        {
            printf("number: ");
            char number_string[sizeof(int) * 8 + 1];
            fflush(stdin);
            scanf(" %s", &number_string);
            printf("\n");
            print_binary_number_decimal(number_string);
        }
        else if (main_menue_choice == '3')
        {
            break;
        }
        else
        {
            printf("Enter a valid argument!");
        }

        printf("\n");
    }
}

1 Ответ

0 голосов
/ 04 января 2019

У вас неопределенное поведение, потому что вы делаете:

  • fflush(stdin)
  • не имеет завершенного нулями bits массива, который вы позже напечатаете в виде строки.

Do:

char bits[sizeof(int) * 8 + 1] = {0};

, который инициализирует весь массив bits нулями (таким образом, он будет иметь нулевой терминатор для bits) и избавится от всех вызовов fflush(stdin); fflush определено только для выходных потоков в стандарте C.

Вам также не нужен начальный пробел в строке формата для сканирования целых (%i) и строк (%s), поскольку они уже игнорируют предыдущие пробелы.

И сбросьте & здесь:

scanf(" %s", &number_string);

number_string при переходе к scanf уже распадается на char*, что scanf ожидает для %s. То, что вы в настоящее время передаете scanf, относится к типу char (*)[33], что неправильно для %s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...