C - Nieoczekiwany błąd segmentacji na strtok (…)

Używam strtok (...) biblioteki i wygląda na to, że działa poprawnie aż do warunku końcowego, gdzie powoduje błąd segmentacji i awarię programu. Interfejs API twierdzi, że strtok (...) wyświetli NULL, gdy nie ma już więcej tokenów do odnalezienia, co oznaczało, pomyślałem, że trzeba było złapać NULL, aby zakończyć wszystkie pętle, które były uruchomione przy użyciu strtok ( ...). Co muszę zrobić, aby złapać NULL, aby zapobiec awarii programu? Wyobrażałem sobie, że NULL może być używany jako warunek zakończenia.

Przygotowałem SSCCE, abyś mógł obserwować to zachowanie. Potrzebuję strtok (...) do pracy na znacznie większym oprogramowaniu, które piszę, i otrzymuję dokładnie takie samo zachowanie segmentacyjne. Dane wyjściowe w wierszu polecenia są pokazane poniżej tej winiety kodu (tak, wiem, że używasz <...> do zamknięcia bibliotek, ale miałem trudności z uzyskaniem tego postu, aby wyświetlić biblioteki kodu). Używam gcc w wersji 4.5.3 w systemie operacyjnym Windows 8, a poniżej pokazuje dwa różne smaki tego, jak wyobrażam sobie, że można próbować złapać NULL w pętli.

#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)

questionAnswers(6)

yourAnswerToTheQuestion