C - Unerwarteter Segmentierungsfehler auf strtok (…)

Ich verwende strtok (...) der Bibliothek und es scheint bis zur Endbedingung einwandfrei zu funktionieren, wo es zu einem Segmentierungsfehler und einem Programmabsturz kommt. Die API behauptet, dass strtok (...) NULL ausgibt, wenn keine Token mehr gefunden werden. Ich dachte, Sie müssten diese NULL abfangen, um alle Schleifen zu beenden, die Sie mit strtok (ausgeführt haben. ...). Was muss ich tun, um diese NULL abzufangen, damit mein Programm nicht abstürzt? Ich stellte mir vor, der NULL-Wert könnte als Abbruchbedingung verwendet werden.

Ich habe eine SSCCE vorbereitet, damit Sie dieses Verhalten beobachten können. Ich benötige strtok (...), um für eine viel größere Software zu arbeiten, die ich schreibe, und ich erhalte genau dasselbe Segmentierungsverhalten. Die Ausgabe in der Befehlszeile wird unterhalb dieser Codevignette angezeigt (ja, ich weiß, dass Sie <...> verwenden, um Bibliotheken einzuschließen, aber ich hatte Schwierigkeiten, mit diesem Beitrag die Codebibliotheken anzuzeigen). Ich verwende die gcc-Version 4.5.3 auf einem Windows 8-Betriebssystem und unten werden zwei verschiedene Varianten gezeigt, wie ich mir vorstelle, man könnte versuchen, den NULL-Wert in einer Schleife abzufangen.

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

main(){
  char* from = "12.34.56.78";
  char * ch = ".";
  char * token = strtok(from, ch);
  printf("%s\n",token);
  while(token != NULL){
    token = strtok(NULL, ch);
    printf("%s\n", token);
  }
  printf("Broke out of loop!");
  while(strcmp(token, 0) != 0){
    printf("%s\n",token);
    token = strtok(NULL, ch);
  }
}
############ OUTPUT: ############

$ ./test
12
34
56
78
Segmentation fault (core dumped)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage