我尝试编写一个程序,将十进制数打印为二进制数。如果输入的数字大于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");
}
}
答案 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]
是错误的。