我正在尝试将十进制数转换为二进制数,但我最终得到'随机'ASCII符号作为输出。这是我的计划:
#include <stdio.h>
int main()
{
int number = 0;
int i = 50;
char binary[10];
printf("Enter a number: ");
scanf("%d", &number);
while(number!=0){
binary[i] = number % 2;
i--;
number = number / 2;
}
printf("\n%s", binary);
return 0;
}
答案 0 :(得分:3)
您的代码存在多个问题(没有特定的订单,但我找到了它们):
您正在初始化char
int
行binary[i] = number % 2
;你应该正确地将整数转换为一个字符,如下所示:
binary[i] = '0' + (number % 2);
您正在撰写printf("\n%s", binary);
,其中binary
是char[10]
,因此不一定是空终止的。您应该再向binary
添加一个字符并将其初始化为\0
:
char binary[11];
binary[10] = '\0';
您错误地初始化了数组:首先是i = 50
和binary[10]
。你应该添加一个常量并使用它两次:
#define MAX_SIZE 32
int i = MAX_SIZE - 1;
char binary[MAX_SIZE + 1];
binary[MAX_SIZE] = '\0';
请注意您忘记的-1
,这样可以避免在字符串结尾后写字,而+1
基本上是最后一个问题
您正在阅读int
并尝试获取其二进制表示形式;但负值的(真)二进制表示通常不是你所期望的。喜欢阅读unsigned int
:
unsigned int number;
scanf("%u", &number);
您可以将number % 2
替换为number & 1
,将number /= 2
替换为number >>= 1
;这更能代表您在number
上运行的(二进制)操作。此外,这应该在负整数上正常工作,你的版本不应该(未经测试,无论如何你通常没有理由想要得到负整数的二进制表示):
binary[i--] = '0' + (number & 1);
number >>= 1;
您的号码为零后停止,但这意味着您不一定要填充binary
数组;这意味着您可能在binary
的开头有未初始化的字符(在调试模式下的VC ++上,这应该将IIRC显示为ÿ
个字符)。你应该在你的循环后添加这样的东西,以便填充数组:
while (i >= 0)
binary[i--] = '0';
希望有所帮助!
答案 1 :(得分:1)
您将i初始化为50,但二进制缓冲区的长度仅为10个字符。所以你没有在循环中填充正确的元素。
答案 2 :(得分:1)
#include <stdio.h>
#define MAX_SIZE 32
int main()
{
unsigned int number = 0;
int i = MAX_SIZE - 1;
char binary[MAX_SIZE + 1];
binary[MAX_SIZE] = '\0';
printf("Enter a number: ");
scanf("%u", &number);
while(number!=0)
{
binary[i--] = '0' + (number & 1);
number >>= 1;
}
while (i >= 0)
binary[i--] = '0';
printf("\n%s", binary);
}
希望这会有所帮助......
答案 3 :(得分:0)
您正在从后面到前面填充阵列。一旦数字#34;完成&#34;就停止,并且不要&#34;左边的垫#34;数组开头的剩余字符,因此它们未初始化。要么在开始时将整个数组初始化为'0'
,要么添加如下内容:
while(i >= 0) {
binary[i] = '0';
i--;
}
最后。 (我想我已经初始化为&#39; 0&#39;)。您还需要确保buffer
足够大(50,而不是10)。并插入字符,而不是整数:binary[i] = '0' + (number % 2);