Linux repositories inspector
GNU
2013-05-19
Aliases: strtok_r(3), strtok_r(3), strtok_r(3), strtok_r(3), strtok_r(3), strtok_r(3), strtok_r(3), strtok_r(3), strtok_r(3), strtok_r(3)

manpages-ja-dev

Japanese version of the manual pages (for developers)

man-pages-ja

Japanese man (manual) pages from the Japanese Manual Project

manpages-dev

Manual pages about using GNU/Linux for development

man-pages

Linux kernel and C library user-space interface documentation

名前

strtok, strtok_r - 文字列からトークンを取り出す

書式

#include <string.h>

char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
strtok_r(): _SVID_SOURCE || _BSD_SOURCE || _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

説明

strtok() 関数は文字列を 0 個以上の空でないトークンの列に分割する。 strtok() を最初に呼び出す際には、解析対象の文字列を str に 指定する。同じ文字列の解析を行うその後の呼び出しでは、 str は NULL にしなければならない。
delim 引き数には、解析対象の文字列をトークンに区切るのに使用する バイト集合を指定する。同じ文字列を解析する一連の呼び出しにおいて、 delim に違う文字列を指定してもよい。
strtok() のそれぞれの呼び出しでは、次のトークンを格納したヌル終端 された文字列へのポインターが返される。この文字列には区切りバイトは含まれ ない。これ以上トークンが見つからなかった場合には、NULL が返される。
同じ文字列に対して操作を行う strtok() を連続して呼び出す場合、 次のトークンを探し始める位置を決めるためのポインターが保持される。 最初の strtok の呼び出しでは、 このポインターは対象の文字列の最初のバイトにセットされる。 次のトークンの先頭は、 str 内で次の区切りバイト以外のバイトを前方に検索して決定される。 区切りバイト以外のバイトが見つからなかった場合は、 トークンはこれ以上なく、 strtok() は NULL を返す (したがって、 空の文字列や区切りバイトだけを含む文字列の場合には、 最初の strtok() の呼び出しで NULL が返ることになる)。
各トークンの末尾は、次の区切りバイトが見つかるか、終端のヌルバイト (\(aq\0\(aq) に達するまで文字列を前方に検索することで見つかる。 区切りバイトが見つかった場合には、 現在のトークンの終わりを示すために、 見つかった区切りバイトがヌルバイトで上書きされ、 strtok() はポインターを次のバイトに設定する。 このポインターは、次のトークンを検索する際の開始点として使用される。 この場合、 strtok() は見つかったトークンの先頭へのポインターを返す。
上記の説明の通り、 解析対象の文字列に 2 つ以上の区切りバイトが連続している場合には、 一つの区切りバイトとみなされ、 文字列の先頭や末尾にある区切りバイトは無視される。 言い換えると、 strtok() が返すトークンは必ず空でない文字列となる。 したがって、例えば "aaa;;bbb," という文字列が与えられたとすると、 区切り文字列 ";," を指定した一連の strtok() の呼び出しでは、 "aaa" と bbb" が返り、その次にヌルポインターが返る。
strtok_r() 関数は strtok() のリエントラント版である。 saveptr 引き数は char * 変数へのポインターであり、 同じ文字列の解析を行う strtok_r() の呼び出し間で処理状況を保存するために strtok_r() 内部で使用される。
strtok_r() を最初に呼び出す際には、 str は解析対象の文字列を指していなければならず、 saveptr の値は無視される。それ以降の呼び出しでは、 str は NULL とし、 saveptr は前回の呼び出し以降変更しないようにしなければならない。
strtok_r() の呼び出し時に異なる saveptr 引き数を指定することで、 異なる文字列の解析を同時に行うことができる。

返り値

strtok() と strtok_r() は次のトークンへのポインターか、 トークンがなければ NULL を返す。

属性

マルチスレッディング (pthreads(7) 参照)

The strtok() 関数はスレッドセーフではない。
strtok_r() 関数はスレッドセーフである。

準拠

strtok()
SVr4, POSIX.1-2001, 4.3BSD, C89, C99.
strtok_r()
POSIX.1-2001.

バグ

これらの関数を使うのは慎重に吟味すること。 使用する場合は、以下の点に注意が必要である。
* これらの関数はその最初の引数を変更する。
* これらの関数は const な文字列では使えない。
* 区切りバイト自体は失われてしまう。
* strtok() 関数は文字列の解析に静的バッファーを用いるので、スレッドセーフでない。 これが問題になる場合は strtok_r() を用いること。

以下のプログラムは、 strtok_r() を利用するループを入れ子にして使用し、 文字列を 2 階層のトークンに分割するものである。 1番目のコマンドライン 引き数には、解析対象の文字列を指定する。 2 番目の引き数には、文字列を 「大きな」トークンに分割するために 使用する区切りバイトを指定する。 3 番目の引き数には、「大きな」トークンを細かく分割するために使用する 区切りバイトを指定する。
このプログラムの出力例を以下に示す。
$ ./a.out \(aqa/bbb///cc;xxx:yyy:\(aq \(aq:;\(aq \(aq/\(aq
1: a/bbb///cc
         --> a
         --> bbb
         --> cc
2: xxx
         --> xxx
3: yyy
         --> yyy

プログラムのソース

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) { char *str1, *str2, *token, *subtoken; char *saveptr1, *saveptr2; int j;
if (argc != 4) { fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]); exit(EXIT_FAILURE); }
for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) { token = strtok_r(str1, argv[2], &saveptr1); if (token == NULL) break; printf("%d: %s\n", j, token);
for (str2 = token; ; str2 = NULL) { subtoken = strtok_r(str2, argv[3], &saveptr2); if (subtoken == NULL) break; printf(" --> %s\n", subtoken); } }
exit(EXIT_SUCCESS); }
strtok() を使った別のプログラム例が getaddrinfo_a(3) にある。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
⇧ Top