I\'m trying to convert a decimal number to binary but I somehow end up getting \'random\' ASCII symbols as an output. Here is my program:
#include
You are filling in your array from the back to the front. You stop once the number is "done", and don't "left pad" the remaining characters at the start of the array so they are not initialized. Either initialize the whole array to '0'
at the start, or add something like:
while(i >= 0) {
binary[i] = '0';
i--;
}
at the end. (I think I'd got with initializing to '0'). You also need to ensure that buffer
is big enough (50, not 10). And insert chars, not ints: binary[i] = '0' + (number % 2);
You initialize i to 50 yet your binary buffer is only 10 characters in length. So you are not populating the correct elements inside the loop.
There are multiple problems with your code (no specific order but the one I found them):
You are initializing a char
with an int
at line binary[i] = number % 2
; you should properly transform the integer to a character, like this:
binary[i] = '0' + (number % 2);
You are writing printf("\n%s", binary);
where binary
is a char[10]
, thus not necessarily null-terminated. You should add one more character to binary
and initialize it to \0
:
char binary[11];
binary[10] = '\0';
You are wrongly initializing your array: you start with i = 50
and binary[10]
. You should add a constant and use it twice:
#define MAX_SIZE 32
int i = MAX_SIZE - 1;
char binary[MAX_SIZE + 1];
binary[MAX_SIZE] = '\0';
Note the -1
you forgot, that avoids that you write after the end of the string, and the +1
that is essentially the last problem
You are reading an int
and trying to get its binary representation; but the (true) binary representation of a negative value is usually not what you would expect. Prefer reading an unsigned int
:
unsigned int number;
scanf("%u", &number);
You could replace number % 2
with number & 1
and number /= 2
with number >>= 1
; which is more representative of exactly what (binary) operations you are running on number
. Besides, this should actually work correctly on negative integers, where your version should not (untested, anyway you usually have no reason of wanting to get the binary representation of a negative integer):
binary[i--] = '0' + (number & 1);
number >>= 1;
You stop after your number is zero, but that means you did not necessarily fill the binary
array; this implies you may have uninitialized characters at the beginning of binary
(on VC++ in debug mode this should IIRC be displayed as ÿ
characters). You should add, after your loop, something such as this so as to fill the array:
while (i >= 0)
binary[i--] = '0';
Hope that helps!
#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);
}
Hope this helps....