输入大于127的数字时,将打印出垃圾

时间:2019-01-04 20:38:38

标签: c

我尝试编写一个程序,将十进制数打印为二进制数。如果输入的数字大于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 :(得分:0)

您有未定义的行为,因为您这样做:

  • fflush(stdin)
  • 没有零终止的bits数组,您以后将其打印为字符串。

要做:

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

用零初始化整个数组bits(因此它自然会为bits加上零终止符),并摆脱所有fflush(stdin)的调用; fflush仅在标准C语言中为输出流定义。

您也不需要格式字符串中的前导空格来扫描int(%i)和字符串(%s),因为它们已经忽略了以前的空格。

&放在此处:

scanf(" %s", &number_string);

number_string在传递给scanf时已经衰减为char*scanf的期望。您当前传递给%s的是scanf类型的,这对于char (*)[33]是错误的。