2016-08-12 6 views
0

Ich erhalte einen Fehler Segmentierung Fehler, wenn ich den Code ausführen, aber anders als kompiliert und läuft. Wenn Sie wissen, warum der Fehler auftritt, würde ich die Hilfe zu schätzen wissen. Bitte erkläre auch warum es passiert, da ich neugierig bin.Ich erhalte einen SegFault-Fehler, aber warum?

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

int main() 
{ 
    float att,def,hp,agi,stl,wis,ran,acc; 
    char name[10],contents[100]; 
    int warrior,lvl=1,kills=0; 

    printf("What is your name?\n"); 
    gets(name); 

    printf("1: Ninja\n"); 
    printf("2: Knight\n"); 
    printf("3: Archer\n\n"); 
    printf("Pick a warrior.\n"); 
    scanf("%i",warrior); 

    ... 

    char attack[10],defense[10],health[10],agility[10],stealth[10],wisdom[10],range[10],accuracy[10],level[10],kill[10]; 
    snprintf(attack,10,"%f",att); 
    snprintf(defense,10,"%f",def); 
    snprintf(health,10,"%f",hp); 
    snprintf(agility,10,"%f",agi); 
    snprintf(stealth,10,"%f",stl); 
    snprintf(wisdom,10,"%f",wis); 
    snprintf(range,10,"%f",ran); 
    snprintf(accuracy,10,"%f",acc); 
    snprintf(level,10,"%f",lvl); 
    snprintf(kill,10,"%f",kills); 

    char my_path[25]; 
    strcat(my_path,"Warriors/"); 
    strcat(my_path,name); 
    strcat(my_path,".txt"); 


    FILE *fp; 
    fp = fopen(my_path, "w+"); 

    fputs(attack, fp); 
    fputs(" ", fp); 
    fputs(defense, fp); 
    fputs(" ", fp); 
    fputs(health, fp); 
    fputs(" ", fp); 
    fputs(agility, fp); 
    fputs(" ", fp); 
    fputs(stealth, fp); 
    fputs(" ", fp); 
    fputs(wisdom, fp); 
    fputs(" ", fp); 
    fputs(range, fp); 
    fputs(" ", fp); 
    fputs(accuracy, fp); 
    fputs(" ", fp); 
    fputs(level, fp); 
    fputs(" ", fp); 
    fputs(kill, fp); 

    fclose(fp); 
} 
+1

nicht 'gets' anwenden. – stackptr

+0

Aber verwenden Sie einen Debugger. – kaylum

+3

'scanf ("% i ", Krieger);' -> 'scanf ("% i ", & Krieger);' – kaylum

Antwort

2

Es gibt folgende Probleme im Code.

  1. Falsche Verwendung von scanf beim Lesen Wert für warrior.

    /* scanf("%i",warrior); */ // Put '&' before warrior 
    scanf("%i",&warrior); 
    
  2. Falsche Formatbezeich in snprintf beim Drucken Werte der ganzen Zahlen lvl und kills.

    /* snprintf(level,10,"%f",lvl); */ // Change %f to %d 
    snprintf(level,10,"%d",lvl); 
    /* snprintf(kill,10,"%f",kills); */ // Change %f to %d 
    snprintf(kill,10,"%d",kills); 
    
  3. Mit strcat mit my_path ohne es zu initialisieren.

    /* char my_path[25]; */ // Initialize as seen below 
    char my_path[25] = ""; 
    strcat(my_path,"Warriors_"); 
    strcat(my_path,name); 
    strcat(my_path,".txt"); 
    
  4. Schließlich verwenden Sie gets, die vermieden werden sollten. Sie können es in fgets ändern.


kommt nun, warum Ihr Programm abstürzt.

Zuerst, wenn Sie getan haben scanf("%i",warrior);: Anstelle der Adresse (d. H. &warrior) gaben Sie den Wert warrior Variable. Und da nicht initialisiert wurde, hatte es einen unbestimmten Wert. Jetzt hat scanf den Wert warrior als Adresse behandelt und versucht, den Wert dort zu schreiben. Und da der Wert warrior unbestimmt war, hat er ein undefiniertes Verhalten ausgelöst.

Zweitens, wenn Sie %f anstelle von %d (nicht übereinstimmende Formatangabe) in snprintf verwendet, der Code erneut undefiniert Verhalten aufgerufen.

Drittens, wenn Sie strcat ohne Initialisierung my_path verwenden, wird Ihr Array my_path unbestimmte Werte haben. Jetzt sucht strcat nach Wert 0 beginnend von der Adresse, die durch my_path gezeigt wird, und schaut weiter, bis es 0 findet. Dabei versucht es möglicherweise, Werte außerhalb des Arrays zu lesen, was wiederum zu undefiniertem Verhalten führt.

Wenn undefiniertes Verhalten aufgerufen wird, kann alles passieren. In Ihrem Fall haben Sie einen Segmentierungsfehler erhalten.


P. S.: Sie sollten auch den Rückgabewert scanf überprüfen, um zu überprüfen, ob es erfolgreich war oder nicht.

P.S.: Sie sollten auch den Rückgabewert von überprüfen, um zu überprüfen, ob es erfolgreich war oder nicht.

1
scanf("%i",warrior); 

scanf erwartet einen Zeiger. http://linux.die.net/man/3/scanf

Fix es

scanf("%i", &warrior); 
+2

Eine weitere: 'char my_path [25];' -> 'char my_path [25] =" ";. Weil OP 'strcat' für diesen Puffer verwendet. – kaylum

0

Sie sollten auch diese Art von Code hinzufügen, um zu überprüfen, ob fopen erfolgreich ist.

if(fp==NULL) 
    { 
     printf("can't open file:%s\n",my_path); 
    } 
    else 
    { 
     ...... 
    } 
0

diese beiden Linien:

char my_path[25]; 
strcat(my_path,"Warriors/"); 

sind falsch, da die strcat() Funktion bis zum Ende der aktuellen Zeichenfolge anhängt (wo es ein NUL Zeichen '\ 0' findet)

Es gibt nicht zu sagen, wo der NUL char gefunden wird.

vorschlagen mit:

char my_path[25]; 
strcpy(my_path,"Warriors/"); 
Verwandte Themen