ライブラリの strtok(...) を使用していますが、セグメンテーション違反とプログラムのクラッシュが発生する終了条件まで正常に動作しているようです。API は、strtok(...) が見つからないトークンがなくなると NULL を出力すると主張しています。つまり、strtok( を使用して実行していたループを終了するには、この NULL をキャッチする必要があると思いました。 ...)。プログラムのクラッシュを防ぐために、この NULL をキャッチするにはどうすればよいですか? 終了条件として NULL の使用が許可されていると想像しました。
この動作を観察するための SSCCE を用意しました。私が書いているはるかに大きなソフトウェアで動作するには strtok(...) が必要で、まったく同じセグメンテーション動作が得られます。コマンド ラインでの出力は、このコード ビネットの下に表示されます (はい、ライブラリを囲むために <...> を使用していることは知っていますが、この投稿でコード ライブラリを表示するのに苦労していました)。私は Windows 8 OS で gcc バージョン 4.5.3 を使用しています。以下に、ループ内で NULL をキャッチしようとする方法の 2 つの異なるフレーバーを示します。
#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);
}
}
############ 出力: ############ $ ./テスト 12 34 56 78 セグメンテーション違反 (コアダンプ)