2016-04-16 16 views
-2

Ich habe versucht herauszufinden, was mit meinem Code falsch ist. Ich glaube, dass ich den Schuldigen gefunden habe. es ist dieser Teil des Codes hier, dass esWie löse ich diesen Segmentierungsfehler?

if (strcmp(input, "load 1") != 0 || strcmp(input, "load 2") != 0 || strcmp(input, "quit") != 0) 
    { 
     Player player; 
     Position position; 
     Direction direction; 

     char* tok; 
     char* firstInput=0; 
     char* secondInput=0; 
     char* thirdInput=0; 
     char* fourthInput=0; 
     int x; 
     int y; 
     char str[10]; 
     char str2[10]; 


     tok = strtok(input, " "); 
     strcpy(firstInput, tok);    
     tok = strtok(NULL, ", "); 
     strcpy(secondInput, tok);   
     tok = strtok(NULL, ", "); 
     strcpy(thirdInput, tok);   
     tok = strtok(NULL, ""); 
     strcpy(fourthInput, tok);    

     strcpy(str, secondInput); 
     x = atoi(str); 
     strcpy(str2, thirdInput); 
     y = atoi(str2); 

     if(strcmp(firstInput, "init") == 0) 
     { 
      if(x >= 0 && x <= 9) 
      { 
       if(y >= 0 && y <= 9) 
       { 
        if (strcmp(fourthInput,"north") == 0 || (strcmp(fourthInput,"south")) || (strcmp(fourthInput,"west") == 0) || (strcmp(fourthInput,"east") == 0)) 
        { 
         position.x = x; 
         position.y = y; 

         if(strcmp(fourthInput,"north") == 0) 
         { 
          direction = NORTH; 
         } 
         if(strcmp(fourthInput,"south") == 0) 
         { 
          direction = SOUTH; 
         } 
         if(strcmp(fourthInput,"west") == 0) 
         { 
          direction = WEST; 
         } 
         if(strcmp(fourthInput,"east") == 0) 
         { 
          direction = EAST; 
         } 
         initialisePlayer(&player, &position, direction); 
         placePlayer(board, position); 
         displayDirection(direction); 
        } 
       } 
      } 
     }      
    } 

von dem, was ich weiß, Segmentierungsfehler bedeutet ein Speicherproblem verursacht. Ich habe dafür gesorgt, dass es genug Platz für alles gibt. Was geht eigentlich vor?

+1

Mögliche Duplikate von [Wie Segmentierungsfehler zu debuggen?] (Http://stackoverflow.com/questions/29324796/how-to-debug-segmentierung-fault) – OrangeDog

+2

Ähm, Sie haben noch keinen Speicher zugeordnet. 'firstInput' ist immer noch 0. –

+1

Welche Zeile segfault? Was ist das Backtrace? – fluter

Antwort

1

Wie in den Kommentaren erwähnt, firstInput und seine Geschwister haben keinen Speicher zugeordnet, wo Sie strcpy zu. Sie sind NULL, was zu einem Segmentierungsfehler führt.

Sie könnten Speicher reservieren oder diese Variablen zu lokalen Arrays machen, aber das brauchen Sie nicht wirklich. strtok gibt Zeiger in input zurück. Diese sind gültig, solange input nicht überschrieben wird. Sie verwenden diese Zeiger nur, um die aktuelle Zeile vor dem Lesen der nächsten Zeile in input zu analysieren, das ist also in Ordnung.

Nehmen Sie direkt aus dem Zwischen tok und das Ergebnis der Token befreien:

char* firstInput = NULL; 
    char* secondInput = NULL; 

    firstInput = strtok(input, " "); 
    if (firstInput) secondInput = strtok(NULL, ", "); 

    // analyse input 

Wenn mit Zeigern zu tun, stellen Sie sicher, für NULL zu testen, bevor sie zugreifen. Es gibt keine Garantie dafür, dass Benutzereingaben genau vier Tokens (oder überhaupt Tokens) enthalten.

0

Sie von hier aus starten könnte:

char* firstInput=0; 
... 
strcpy(firstInput, tok); 

wo firstInput noch NULL ist, und kein Speicher ist für sie zugeordnet sind, aber Sie versuchen tok, um es zu kopieren.

Verwendung malloc() Speicher zuzuweisen, wie folgt aus:

firstInput = malloc(sizeof(char) * (strlen(tok) + 1)); 
if (firstInput==NULL) 
    exit (1); 

Dies sollten Sie mit Ihrem Debuggen gestartet. :)

Verwandte Themen