C言語編 標準ライブラリのリファレンス strtok

先頭へ戻る

strtok関数

概要 文字列を分割する。
ヘッダ string.h
形式 char* strtok(char* str, const char* set);
引数 str 対象の文字列。2回目以降の呼び出し時には、ヌルポインタを指定。
set 区切り文字を書き並べた文字列。
戻り値 分割して得られた文字の並びを指すポインタを返す。文字の並びが得られなかった場合は、ヌルポインタが返される。
詳細 まず前提として、この関数は何度も繰り返し呼び出すような使い方をすることを理解しておくこと。
この関数の目的は、ある文字列を、特定の区切り文字ごとに分割することである。例えば、"abc,defgh,ij" という文字列に対し、区切り文字を "," として与えれば、"abc"、"defgh"、"ij" を得られる。
1度目の呼び出しの際にだけ、引数str に対象となる文字列を指定する。2度目以降は、前回の続きから調べるということを表すために引数str をヌルポインタとする。したがって、1度目と、2度目以降とでは、引数str に与えるべき値は異なる。引数set に関しては、その必要があれば呼び出しごとに異なっても構わない。
引数set に含まれる各文字がそれぞれ区切り文字の候補である。例えば ".," を与えたとすれば、'.' でも ',' でも区切り文字とみなされる。
注意 関数内で、引数str が指す文字列の内容は書き換えられることに注意(引数str には const修飾子が付いていない)。具体的には、区切り文字の部分を '\0' に書き換えている。こうして、戻り値として返されるポインタが、引数str が指す文字列内のどれかの文字を指しており、かつ終端に '\0' が適切に置かれていることが保証される。
この関数は、一連の呼び出しを処理するために、必要な情報を保持している。そのため、同時に複数系統の一連の呼び出しを行うと、両者の情報が混線して正しい結果を返せない。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[] = "abc,defgh,ij";
    const char* const separator = ",";
    char* token;


    token = strtok( str, separator );
    while( token != NULL ){
        puts( token );
        token = strtok( NULL, separator );
    }

    puts( "" );
    puts( "元の文字列が直接書き換えられていることを確認" );
    puts( str );

    return 0;
}

実行結果:

abc
defgh
ij

元の文字列が直接書き換えられていることを確認
abc
関連 ワイド文字列版の wcstok関数がある。
解説章


参考リンク

更新履歴

'2018/4/22 解説中で C95 を(C89 に対して)特別扱いしないように修正。そもそもC言語編は C95ベースなので、余計な説明は省く。

'2018/4/20 「NULL」という表記を「ヌルポインタ」に修正。

'2018/4/17 全体的に文章を見直し修正。

'2018/1/22 新規作成。





標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS