2013-11-08 6 views
0

У меня есть задание написать программу, которая преобразует десятичные числа в двоичные числа на языке программирования C.Выход двоичного числа в C

Это код, который я написал:

#include <stdio.h> 
#define MAX_LEN 1000 

void translate_dec_bin(char s[]){ 
    unsigned int decNum; 
    sscanf_s(s, "%d", &decNum); 

    while (decNum > 0){ 
     printf("%d", decNum % 2); 
     decNum = decNum/2; 
    } 
    printf("\n"); 
} 

main(){ 
    char s[MAX_LEN]; 
    char c='\0'; 
    int count=0; 
    printf("enter a nunber\n"); 
    while (c < MAX_LEN && ((c = getchar()) != EOF) && c != '\n'){ 
     s[count] = c; 
     ++count; 
    } 
    translate_dec_bin(s); 
} 

Однако, когда вход 1, выход я получаю 1 вместо 0001. Другими словами, я хочу 0, чтобы появиться в моем выходе. Как я могу это сделать?

+2

Используйте отладчик. Просматривайте свой код по очереди, проверяя переменные, когда идете. Вы скоро увидите, что ваш код немного беспорядок, и хотя кто-то, вероятно, опубликует ответ для вас, чтобы получить репутацию, вы не узнаете об этом. Вы можете научиться самостоятельно отлаживать эту проблему. – mah

+0

Хорошо, спасибо. Я попытаюсь найти руководство по отладке в Visual Studio. Итак, вы говорите, что есть проблема с моим кодом, который предотвращает печать нулей? @mah – Alan

+0

Я говорю, что нет оснований думать, что код, который вы предоставили, будет печатать эти ведущие нули, и когда вы перешагнете, я подозреваю, что вы увидите причину. Проблема не является чем-то особенно запутанным, и когда вы это видите, вы, вероятно, пожалеете о помощи в этом;) – mah

ответ

0

Предполагая, что вы уже вычислили ваше десятичное число основной идея без использования печати форматирования заключается в следующем:

char* list[] = {"0000", "000", "00", "0", ""}; 

char* leading_of(int num) { 
    int v = 0; 
    while(num > 0 && v < 4){ 
     num = num /10; 
     v++; 
    } 
    return list[v]; 
} 

printf("%s%d", leading_of(decNum), decNum); 

Если число символов или символ заполнения является переменным вам нужно удалить список и сделать что-то более умное.

1

Во-первых, прочитайте комментарий маха: хотя он предлагает ударить муху с ядерной ракетой, он предлагает вам правильный подход.

Но в этом случае ваша проблема проста: ваш цикл в функции translate_dec_bin завершается, потому что ему нечего делать.

Подумайте о секунде: ваше состояние «while decNum больше 0, печать 1 или 0», правильно? Я думаю, вы уже знаете, что в C, если вы разделите целое число, остаток будет пропущен, поэтому 1/2 = 0.

Теперь посмотрите на свой код: когда вы даете аргумент «1», цикл повторяется только один раз, поэтому вы получаете только один символ на выходе.

Если вы хотите больше символов, вам нужно больше условий. Я оставляю это вам, чтобы придумать их, я не так голоден, как предложил мах :)

И, кстати, нет способа разместить 1000 цифр длинного числа в неподписанном int и это то, что вы пытаетесь сделать.

+0

Хуже того, что он не может уместить столько цифр в свой номер, его страж в буфере 1000 символов ошибочно принимает значение char, а не «счет», который он предположительно намеревался использовать. Я не уверен, что вы подразумеваете под «ядерной ракетой», но если вы имеете в виду, потому что я предлагаю переписать большую часть его кода (я есть, и я понимаю, почему вы могли бы назвать это ядерным оружием), это потому, что в моем просмотр, больше кода затрудняет просмотр проблем ... что-то часто неизбежно (код должен быть там), но в этом случае много ненужного кода, помогающего скрыть реальные недостатки (и ввести больше) – mah

+1

Я имел в виду отладчик и переписывал все от начала. Не поймите меня неправильно, я полностью согласен с каждым словом, которое вы написали. Я все еще помню, как звучали пугающие комментарии, подобные твоим, когда я был новичком, и в небольшой программе для обучения, такой как его, я не вижу смысла пугать его так. Когда его программы начнут работать, пришло время быть серьезными. –

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