名 前
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 が 返 る こ と に な る )。 各 ト ー ク ン の 末 尾 は 、 次 の 区 切 り バ イ ト が 見 つ か る か 、 終 端 の ヌ ル バ イ ト ('\0') に 達 す る ま で 文 字 列 を 前 方 に 検 索 す る こ と で 見 つ か る 。 区 切 り バ イ ト が 見 つ か っ た 場 合 に は 、 現 在 の ト ー ク ン の 終 わ り を 示 す た め に 、 見 つ か っ た 区 切 り バ イ ト が ヌ ル バ イ ト で 上 書 き さ れ 、 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
'a/bbb///cc;xxx:yyy:' ':;' '/'
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) に あ る 。
関 連 項 目
index(3), memchr(3), rindex(3), strchr(3), string(3), strpbrk(3), strsep(3), strspn(3), strstr(3), wcstok(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。