2017-05-04 4 views
-3

Der Code ist in Ordnung. Bei der Ausführung bekomme ich nur die Nachricht (Segmentierungsfehler (Core Dump)). Jede Hilfe würde sehr geschätzt werden!Segmentierungsfehler (Core Dumped) - C Keine Probleme mehr mit Segmentierungsfehler. Jetzt kann ich debuggen. danke

Das Programm soll die Basis der eingegebenen Argumente ändern. zum Beispiel ./convert 10 2 5 6 7 Eingang Basis: 10 Ausgangsbasis: 2 Argumente Eingabebasis: 5 6 7

fange ich gerade c zu lernen ... jede Hilfe würden Sie bieten könnten sei großartig! Danke!

Bearbeitet: Keine Probleme mehr mit Segmentierungsfehler. Vielen Dank.

#include <stdio.h> 
#include <string.h> 




int makeInt(char digits[]) { 
    int num = 0; 
    int i = 0; 
    while (digits[i] != '\0') { 
    num = num * 10 + (digits[i] - '0'); 
    i++; 
} 
return num; 
} 


//converts from original base to base 10 
int makeBase10(char digits[],int a) { 
    int num = 0; 
    int pow = 1; 
    int i = 0; 
    int x = 0; 
    int length = strlen(digits); 
    char k; 
    for (i = length -1; i > -1; i--){ 
     k = digits[i]; 
     if(k <= '9' && k >= '0'){ 
      x = (int)k - '0'; 
     } 
     else{ 
      x = (int)k - 'a' + 10; 

     } 
     num = num + (x*pow); 
     pow = pow * a; 

    } 
    return num; 
} 
//changes number from base 10 to knew base 
// and returns as string 
char * toString(char str[], int num, int b) { 

    int i = 0; 
    char x; 
    int mod = 0; 
    while(0 < num){ 
     mod = num % b; 
     if(mod < 10 && mod > -1){ 
      x = (char)(num + '0'); 
     } 
     else{ 
      x = (char)(num - 10 + 'a'); 
     } 

     str[i] =(int) x; 
     num = num/b; 
    } 
    str[i] = '\0'; 

    int length = i + 1; 
    int j = 0; 
    char *reverse; 
    for(i = length -2; i >= 0; i--){ 

     reverse[i] = str[j]; 
     j++; 
    } 
    reverse[length-1] = '\0'; 
    return reverse; 
} 



int main(int argc, char *argv[]) { 
    int i; 
    int num; 
    int a; 
    int b; 
    char str[33]; //binary could be up to 32 + '\0' 
    a = makeInt(argv[0]); //input base 
    b = makeInt(argv[1]);; //output base 
    printf("make int worked and input works"); 
    num = 0; 
    i = 2; 
    while (i < argc) { 
     num = makeBase10(argv[i], a); 
     printf("%s\n", toString(str, num, b)); 
      i++; 
    } 


} 
+0

Wie wäre es mit einigen Debuggen? Fügen Sie einige Ausdrucke hinzu, um herauszufinden, wie weit Ihr Programm kommt, bevor es abstürzt. Sie werden herausfinden können, welches Bit abstürzt und wahrscheinlich das Problem herausfinden - alles ohne die Frage "debug my code" auf SO zu stellen. – John3136

+0

Ich würde mir auch den Rückwärtszeiger genau ansehen. – nfproductions

+0

kann ich nicht, ich legte eine printf-Anweisung in der ersten Zeile in Haupt und immer noch nichts ... es muss ein Fehler sein, wie ich diesen Code formatiert habe ... ehrlich gesagt bin ich nicht vertraut mit dieser Sprache und bin einfach unsicher, wie es weitergeht. – Graham

Antwort

0

char in toStrong Reverse * ist kein Speicher zugewiesen, die zu segmentieren Fehler, ein Teil von diesem argv führen könnte [0] immer der Programmname Sie ausführen, müssen Sie argv verwenden [1] weiter für Ihre Eingaben

+0

Nicht unbedingt immer. Siehe http://stackoverflow.com/questions/2050961/is-argv0-name-of-executable-an-accepted-standard-or-just-a-common-conventi – ktbiz

+0

Super hilfreich! Vielen Dank – Graham

1

Sie verwenden einen nicht initialisierten Zeiger.

int length = i + 1; 
int j = 0; 
char *reverse; // here is the problem 
for(i = length -2; i >= 0; i--){ 

    reverse[i] = str[j]; 
    j++; 
} 
reverse[length-1] = '\0'; 

Wenn ein nicht initialisierte Zeiger verwenden Sie schreiben, was auch immer geschieht Speicheradresse in diesen Variablen gespeichert werden. Es wurde kein vernünftiger Wert angegeben. Daher schreiben Sie in einen Speicherort, der nicht für Apps gedacht ist. Computerspeicher ist segmentiert. Jeder Speicherbereich hat einen Besitzer, der dort schreiben kann. Es ist eine Sicherheitsvorkehrung und verhindert, dass Bugs das System durcheinander bringen. Sie müssen zunächst initialisiert werden entweder mit malloc

char *reverse = malloc(length); 

oder wenn Sie bei der Kompilierung kennen eine maximale Größe, die Sie tun können:

char reverse[MAX_SIZE]; 

P. S. Um umzukehren, durchquert man nicht die ganze Saite bis zum Anfang nur die Hälfte. Anstatt for(i = length -2; i >= 0; i--)
schreiben: for(i = length -2; i >= length/2; i--)

+0

Danke! Ich kann printf-Anweisungen jetzt zum debuggen benutzen .... Ich habe keinen Segmentierungsfehler mehr! – Graham

Verwandte Themen