2016-09-03 2 views
1

Ich habe vor kurzem mit der Programmierung in C begonnen und ich kann den Fehler hier wirklich nicht finden, egal wie sehr ich es versuche.Konvertieren von Dezimal zu Binärfehler (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; 
} 

Es zeigt nichts, nachdem ich die Nummer und seltsam eingeben, wenn ich eine printf in der Funktion Schleife tun tut es Druck etwas für ist [i].

Vielen Dank im Voraus für Sie helfen.

+6

Vielleicht eine gute Zeit, um zu lernen, wie man den Debugger verwendet –

+1

@RadLexus: Heh, nein. Ich lag völlig falsch. Es ist tatsächlich * ziemlich übermäßig * null-terminiert. Das ist eigentlich der Fehler. – EOF

+0

@EdHeal Ich bin neu in C-Programmierung, ich habe versucht, mein Programm mit gdb zu starten, aber es wird korrekt beendet und ich weiß nicht, wie ich andere Funktionen verwenden soll. Ich habe überprüft, ob es Probleme mit dem Schreiben/Lesen von Werten gibt mein Array mit Valgrind aber es hat nichts Ungewöhnliches zurückgegeben, wenn Sie ein gutes Tutorial haben, würde ich es gerne nehmen – aslad

Antwort

2

void *calloc(size_t nmemb, size_t size) ordnet nmemb Anzahl von Speicherblöcken und initialisiert sie mit 0, dem \0 Charakter für dieses Szenario typecasted wird . Jetzt wird printf den bin String drucken, bis er ein \0 Zeichen erhält. Nehmen wir ein Beispiel. Wenn ich 12 eingeben, sollte der Ausgang 1100 sein. Aber in Ihrem bin String ist es \0\0\0\01100\0. Und so hört printf auf zu drucken, nachdem es das erste Zeichen \0 trifft.

2

Versuchen:

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

Erläuterung: CHAR_BIT (in <limits.h>) ist die Anzahl der Bits in einem char und sizeof(int) ist die Anzahl der char s in einem int.

Ihr Code zeigt wahrscheinlich nichts an, da Ihre Schleife stoppt, bevor das erste Zeichen des zugewiesenen Arrays erreicht wird. Dies ist wahrscheinlich immer noch '\0' und wird daher als leere Zeichenfolge betrachtet.

Statt die langsamer der Verwendung % und /, können Sie tun:

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

put folgenden Code

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

, weil Sie Ihre bin von rechts nach links füllen. aber wenn Sie nicht bis zu 0 Ort ist füllen bedeutet es ist starre Position enthält ‚\ 0‘ initialisiert durch calloc Funktion

+0

'für (int i = 0; i <8; i ++)' –

+0

Ja, Sie haben Recht durch Fehler Ich schrieb 9 danke @WeatherVane für die Korrektur mich. – Abhishek