在C中将十进制数转换为二进制数
我正在尝试将十进制数转换为二进制数,但我最终得到’随机’ASCII符号作为输出。 这是我的计划:
#include 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; }
您的代码存在多个问题(没有特定的订单,但我找到了它们):
-
您正在初始化一个带有
binary[i] = number % 2
行的int
的char
; 你应该正确地将整数转换为一个字符,如下所示:binary[i] = '0' + (number % 2);
-
你正在写
printf("\n%s", binary);
其中binary
是char[10]
,因此不一定是null终止的。 您应该再添加一个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
并尝试获取其二进制表示forms; 但负值的(真)二进制表示通常不是你所期望的。 首选读取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';
希望有所帮助!
您将i初始化为50,但二进制缓冲区的长度仅为10个字符。 所以你没有在循环中填充正确的元素。
#include #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); }
希望这可以帮助….
您正在从后面到前面填充arrays。 一旦数字“完成”就停止,并且不要在数组的开头“剩余填充”剩余的字符,这样它们就不会被初始化。 要么在开始时将整个数组初始化为'0'
,要么添加如下内容:
while(i >= 0) { binary[i] = '0'; i--; }
在末尾。 (我想我初始化为’0’)。 您还需要确保buffer
足够大(50,而不是10)。 并插入字符,而不是整数: binary[i] = '0' + (number % 2);