■strtokの意味
strtok=string+token
string=文字列
token=単語
strtokは文字列を単語に分解する関数です。
■strtokの簡単な使い方
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void 文字列を分離文字で分解(char *文字列) {
char *単語;
const char *分離文字 = "/";
while((単語 = strtok(文字列,分離文字)) != NULL){
printf("\t処理中->:%s:\n",単語);
//strtok第1引数は2回目からNULL
文字列 = NULL;
}
}
int main(void){
//正常終了する例
char ary[] = "/usr/include/stdio.h";
printf("処理前:%s\n",ary);
文字列を分離文字で分解(ary);
printf("処理後:%s\n",ary);//処理前と変わる
printf("-------------------\n");
fflush(stdout);
}
元の文字列は変わってしまうので注意して下さい。
●実行結果
./a.out
処理前:/usr/include/stdio.h
処理中->:usr:
処理中->:include:
処理中->:stdio.h:
処理後:/usr
-------------------
■strtokの間違った使い方
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void 文字列を分離文字で分解(char *文字列) {
char *単語;
const char *分離文字 = "/";
while((単語 = strtok(文字列,分離文字)) != NULL){
printf("\t処理中->:%s:\n",単語);
//strtok第1引数は2回目からNULL
文字列 = NULL;
}
}
int main(void){
//異常終了する例
char *literal = "/usr/include/stdio.h";
printf("処理前:%s\n",literal);
文字列を分離文字で分解(literal);
printf("処理後:%s\n",literal);
fflush(stdout);
}
●実行結果
./a.out
処理前:/usr/include/stdio.h
Segmentation fault (コアダンプ)
筆者の環境下では、
文字列リテラルは書き換えできないので
異常終了してしまいました。