2015-05-06 3 views
0

Я пытаюсь преобразовать десятичное число в двоичное, но я каким-то образом получаю «случайные» символы ASCII в качестве вывода. Вот моя программа:Преобразование десятичного числа в двоичное в C

#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

Если номер ввести в '-', 'Е («\ п% s», двоичный), 'попытки напечатать неинициализированные памяти - среди других вопросов (как никакой конечный нулевой символ.) – chux

ответ

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'; 
    

Надежда, что помогает!

+0

Если я вхожу в '10', он возвращает' @ ' – schmitsz

+0

Просто добавляя последний пункт, чтобы решить, что может быть первой проблемой, с которой вы сталкиваетесь – Ekleog

+0

Извините, но я чувствую, что ответ не имеет значения. – schmitsz

0

Вы заполняете свой массив с обратной стороны. Вы останавливаетесь, как только число «сделано», и не «оставляйте пэд» оставшихся символов в начале массива, чтобы они не были инициализированы. Либо инициализировать весь массив '0' в начале, или добавить что-то вроде:

while(i >= 0) { 
    binary[i] = '0'; 
    i--; 
} 

в конце. (Я думаю, что я получил инициализацию до «0»). Вам также необходимо убедиться, что buffer достаточно большой (50, а не 10). И введите символы, а не ints: binary[i] = '0' + (number % 2);

+0

Забегает в бесконечный цикл. – schmitsz

1

Вы инициализируете i до 50, но ваш двоичный буфер составляет всего 10 символов. Таким образом, вы не заполняете правильные элементы внутри цикла.

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); 
} 

Надеется, что это помогает ....

Смежные вопросы