2016-10-06 7 views
-1

Ich schreibe ein Programm, um Basis-10-Zahlen in ihre Entsprechungen in anderen Basen zu konvertieren, aber ich bekomme immer einen Segmentierungsfehler, wenn ich versuche, es auszuführen. so weitSegmentierung Fehler in der While-Schleife (C)

Dies ist der Code:

#include <stdio.h> 

int base; 
int num; 
char* num2[50]; 
int x =0; 

int main(){ 

    printf("Input a number in base 10 and a base (2-16) that you would like to convert to in this format: 100 2\n"); 
    fflush(stdout); 
    scanf("%d%d",&num, &base); 
    printf("%d%d", num, base); fflush(stdout); 

    while ((num % base) > 1){ 
     printf("%d", x); fflush(stdout); 
     if(num % base == 10) 
      num2[x] = "A"; 
     else if (num % base == 11) 
      num2[x] = "B"; 
     else if (num % base == 12) 
      num2[x] = "C"; 
     else if (num % base == 13) 
      num2[x] = "D"; 
     else if (num % base == 14) 
      num2[x] = "E"; 
     else if (num % base == 15) 
      num2[x] = "F"; 
     else 
      *num2[x] = num % base; 

     num = num % base; 
     x++; 
     printf("%d, %s", num, num2[x]); fflush(stdout); 
    } 

    while (x >= 0){ 
     printf("%s", num2[1]); 
     fflush(stdout); 
     x--; 
    } 

    printf("\n"); 
    fflush(stdout); 

    return 0; 
} 

Durch die Fehler mit GDB und print-Anweisungen überprüft, habe ich zu dem Schluss gekommen, dass der Fehler von etwas in Zeile stammt 14:

while ((num % base) > 1) { 

Ich bin relativ neu in C, das meiste, was ich getan habe, war in Java.

+0

Sie müssen lernen, GDB besser zu verwenden, da Ihre Diagnose das Zeichen viel verfehlt. http://users.ece.utexas.edu/~adnan/gdb-refcard.pdf –

+0

Ich bin ein Student und es wurde nur kurz in meiner Klasse diskutiert. Danke für die Ref-Karte, das wird in Zukunft definitiv nützlich sein. – Root21

Antwort

0

Beide früheren Antworten sind richtig (d. H. @Sourav und @Tony). Der genaue Grund unter diesen 2 hängt von der Eingabe ab, die während einer Ausführungsinstanz bereitgestellt wird.

  1. Angenommen, Ihre Eingabe ist num = 3, Basis = 16.
    Dann wird Ihr Programm auf der Linie Absturz -
    *num2[x] = num % base;

    num2 [x] auf NULL da 'num2' ein globales Array ist.

  2. Angenommen, Ihre Eingabe ist Num = 13, Basis = 16.
    Dann wird Ihr Programm auf der Linie Absturz -
    num2[x] = "D";

    Dies liegt daran, ‚num‘ bei 13 eine konstant bleibt (num = num % base) und als Ergebnis ‚x‘ würde schließlich ein Wert weit über 49 und num2[x] sein wird auf einen illegalen Ort zugreifen.


Auch ist Ihr Programm logisch fehlerhaft; Sie werden nicht die Leistung erhalten, die Sie mit Ihrem derzeitigen Ansatz wünschen. Ihr Programm muss etwas optimiert werden -

char num2[50]; /* Array of chars, instead of array of pointers to char. */ 

. . .

/* Add check to verify that base is a value between 2 and 16. */ 

while ((num % base) > 0){ /* Greater than 0, not 1. */ 
    if(num % base == 10) 
     num2[x] = 'A'; /* Use a character instead of a string. */ 
    else if (num % base == 11) 
     num2[x] = 'B'; 
    else if (num % base == 12) 
     num2[x] = 'C'; 
    else if (num % base == 13) 
     num2[x] = 'D'; 
    else if (num % base == 14) 
     num2[x] = 'E'; 
    else if (num % base == 15) 
     num2[x] = 'F'; 
    else 
     num2[x] = (num % base) + '0'; /* Convert the number to its character form. */ 

    num /= base; /* Duh! */ 
    printf("%d, %c", num, num2[x]); fflush(stdout); /* %c instead of %s*/ 
    x++; 
} 

while (x >= 0){ 
    printf("%c", num2[x]); fflush(stdout); /* %c instead of %s*/ 
    x--; 
} 
+0

Wow, danke! Meine Argumentation war, dass ich meine Logik reparieren würde, nachdem ich den Fehler behoben hatte, da ich dann Testwerte usw. verwenden konnte. – Root21

+0

Wenn das Ihr Problem gelöst hat, akzeptieren Sie die Antwort; optional upvote. –

0

Das Problem, wie ich es in der else Aussage Körper sehen,

else 
    *num2[x] = num % base; 

hier ist num[x] ein Null-Zeiger. Das kann man nicht dereferenzieren. Sie müssen Speicher num[x] reservieren, bevor Sie diesen Speicherort zu speichern einen Wert verwenden können.