【C言語】
strtok()で Segmentation fault

“文字列リテラル”書き込み禁止 strtok()で Segmentation fault

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 (コアダンプ)

筆者の環境下では、
文字列リテラルは書き換えできないので
異常終了してしまいました。