在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行的intchar ; 你应该正确地将整数转换为一个字符,如下所示:

     binary[i] = '0' + (number % 2); 
  • 你正在写printf("\n%s", binary); 其中binarychar[10] ,因此不一定是null终止的。 您应该再添加一个binary字符并将其初始化为\0

     char binary[11]; binary[10] = '\0'; 
  • 你错误地初始化你的数组:你从i = 50binary[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);