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

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

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


strtok関数

概要

文字列を分割する。

ヘッダ

string.h

形式

char* strtok(char* restrict str, const char* restrict 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 = strtok(str, separator);
    while (token != NULL) {
        puts(token);
        token = strtok(NULL, separator);
    }

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

実行結果:

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 のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る