2016-09-03 2 views
1

Я недавно начал программирование на C, и я действительно не могу найти ошибку здесь, как бы я ни старался.Преобразование десятичной в двоичную ошибку (C)

char* dec2Bin(int number) { 
    char* bin = calloc(9, sizeof(char)); 
    if(bin!=NULL) { 
     bin[8] = '\0'; 
     int i = 7; 
     while(number != 0 && i>=0){ 
      bin[i] = (number%2) +'0'; 
      number/=2; 
      i--; 
     } 
    } 
    return bin; 
} 


int main() { 
    int number; 
    printf("Enter a number: "); 
    scanf("%d", &number); 

    char* bin = dec2Bin(number); 
    if(bin!=NULL) { 
     printf("%s", bin); 
     free(bin); 
     return EXIT_SUCCESS; 
    } 

    return EXIT_FAILURE; 
} 

Он ничего не отображает после я ввожу номер, и как ни странно, когда я делаю Printf в цикле функции он делает что-то для печати бункера [я].

Заранее вам за помощь.

+6

Возможно, самое подходящее время, чтобы узнать, как использовать отладчик –

+1

@RadLexus: Heh, no. Я был совершенно неправ. Это на самом деле * довольно чрезмерно * с нулевым завершением. На самом деле это ошибка. – EOF

+0

@EdHeal Я новичок в программировании на С, я пытался запустить свою программу с помощью gdb, но он выходит из игры правильно, и я действительно не знаю, как использовать другие функции, я проверил, была ли проблема с записью/чтением значений в мой массив с valgrind, но он не вернулся ничего необычного, если у вас есть хороший учебник, я бы с радостью принял его – aslad

ответ

2

void *calloc(size_t nmemb, size_t size) выделяет nmemb числа блоков памяти и инициализирует их с 0, который получает typecasted для \0 характера для этого сценария , Теперь printf напечатает строку bin, пока не получит символ \0. Давайте возьмем пример. Если я нахожу 12, выход должен быть 1100. Но в вашей строке bin это \0\0\0\01100\0. И таким образом printf останавливает печать после того, как он встречает первый символ \0.

2

Попытка:

char* int2Bin(int number) 
{ 
    int bits = sizeof(int) * CHAR_BIT; 
    char* bin = calloc(bits + 1, sizeof(char)); 
    bin[bits] = '\0'; 
    for (int i = bits - 1; i >= 0; i--) 
    { 
     bin[i] = (number % 2) + '0'; 
     number /= 2; 
    } 
    return bin; 
} 

Пояснение: CHAR_BIT<limits.h>) это число битов в char и sizeof(int) это число char с в int.

Ваш код, вероятно, ничего не отображает, потому что ваш цикл останавливается до того, как будет достигнут первый символ выделенного массива, поэтому это, вероятно, все еще '\0' и поэтому считается пустой строкой.

Вместо того, чтобы использовать более медленный % и /, вы можете сделать:

 bin[i] = (number & 1) + '0'; 
     number >>= 1; 
1
after char* bin = calloc(9, sizeof(char)); 

положить следующий код

 for(int i=0;i<8;i++) 
     bin[i]='0'; 

, потому что вы заполняете свой бункер справа налево. но если вы не заполните ДО 0 расположения бункера означает бен уставившись позиция содержит «\ 0» инициализировать с помощью функции calloc

+0

'for (int i = 0; i <8; i ++)' –

+0

Да, вы правы по ошибке Я написал 9 спасибо @WeatherVane за то, что исправил меня. – Abhishek