Man page - strtok(3)

Packages contains this manual

Available languages:

en fr pl ja ru ro

Manual

STRTOK

名 前
書 式
説 明
返 り 値
属 性
準 拠
注 意
バ グ

プ ロ グ ラ ム の ソ ー ス
関 連 項 目
こ の 文 書 に つ い て

名 前

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 (): _POSIX_C_SOURCE
|| /* Glibc versions <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE

説 明

The strtok () function breaks a string into a sequence of zero or more nonempty tokens. On the first call to strtok (), the string to be parsed should be specified in str . In each subsequent call that should parse the same string, str must be NULL.

delim 引 数 に は 、 解 析 対 象 の 文 字 列 を ト ー ク ン に 区 切 る の に 使 用 す る バ イ ト 集 合 を 指 定 す る 。 同 じ 文 字 列 を 解 析 す る 一 連 の 呼 び 出 し に お い て 、 delim に 違 う 文 字 列 を 指 定 し て も よ い 。

strtok () の そ れ ぞ れ の 呼 び 出 し で は 、 次 の ト ー ク ン を 格 納 し た ヌ ル 終 端 さ れ た 文 字 列 へ の ポ イ ン タ ー が 返 さ れ る 。 こ の 文 字 列 に は 区 切 り バ イ ト は 含 ま れ な い 。 こ れ 以 上 ト ー ク ン が 見 つ か ら な か っ た 場 合 に は 、 NULL が 返 さ れ る 。

同 じ 文 字 列 に 対 し て 操 作 を 行 う strtok () を 連 続 し て 呼 び 出 す 場 合 、 次 の ト ー ク ン を 探 し 始 め る 位 置 を 決 め る た め の ポ イ ン タ ー が 保 持 さ れ る 。 最 初 の strtok の 呼 び 出 し で は 、 こ の ポ イ ン タ ー は 対 象 の 文 字 列 の 最 初 の バ イ ト に セ ッ ト さ れ る 。 次 の ト ー ク ン の 先 頭 は 、 str 内 で 次 の 区 切 り バ イ ト 以 外 の バ イ ト を 前 方 に 検 索 し て 決 定 さ れ る 。 区 切 り バ イ ト 以 外 の バ イ ト が 見 つ か ら な か っ た 場 合 は 、 ト ー ク ン は こ れ 以 上 な く 、 strtok () は NULL を 返 す (し た が っ て 、 空 の 文 字 列 や 区 切 り バ イ ト だ け を 含 む 文 字 列 の 場 合 に は 、 最 初 の strtok () の 呼 び 出 し で NULL が 返 る こ と に な る )。

各 ト ー ク ン の 末 尾 は 、 次 の 区 切 り バ イ ト が 見 つ か る か 、 終 端 の ヌ ル バ イ ト ('\0') に 達 す る ま で 文 字 列 を 前 方 に 検 索 す る こ と で 見 つ か る 。 区 切 り バ イ ト が 見 つ か っ た 場 合 に は 、 現 在 の ト ー ク ン の 終 わ り を 示 す た め に 、 見 つ か っ た 区 切 り バ イ ト が ヌ ル バ イ ト で 上 書 き さ れ 、 strtok () は ポ イ ン タ ー を 次 の バ イ ト に 設 定 す る 。 こ の ポ イ ン タ ー は 、 次 の ト ー ク ン を 検 索 す る 際 の 開 始 点 と し て 使 用 さ れ る 。 こ の 場 合 、 strtok () は 見 つ か っ た ト ー ク ン の 先 頭 へ の ポ イ ン タ ー を 返 す 。

上 記 の 説 明 の 通 り 、 解 析 対 象 の 文 字 列 に 2 つ 以 上 の 区 切 り バ イ ト が 連 続 し て い る 場 合 に は 、 一 つ の 区 切 り バ イ ト と み な さ れ 、 文 字 列 の 先 頭 や 末 尾 に あ る 区 切 り バ イ ト は 無 視 さ れ る 。 言 い 換 え る と 、 strtok () が 返 す ト ー ク ン は 必 ず 空 で な い 文 字 列 と な る 。 し た が っ て 、 例 え ば " aaa;;bbb, " と い う 文 字 列 が 与 え ら れ た と す る と 、 区 切 り 文 字 列 " ;, " を 指 定 し た 一 連 の strtok () の 呼 び 出 し で は 、 " aaa " と bbb " が 返 り 、 そ の 次 に ヌ ル ポ イ ン タ ー が 返 る 。

The strtok_r () function is a reentrant version of strtok (). The saveptr argument is a pointer to a char * variable that is used internally by strtok_r () in order to maintain context between successive calls that parse the same string.

On the first call to strtok_r (), str should point to the string to be parsed, and the value of *saveptr is ignored (but see NOTES). In subsequent calls, str should be NULL, and saveptr (and the buffer that it points to) should be unchanged since the previous call.

strtok_r () の 呼 び 出 し 時 に 異 な る saveptr 引 数 を 指 定 す る こ と で 、 異 な る 文 字 列 の 解 析 を 同 時 に 行 う こ と が で き る 。

返 り 値

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

属 性

こ の 節 で 使 用 さ れ て い る 用 語 の 説 明 に つ い て は 、 attributes (7) を 参 照 。

Image grohtml-27057-1.png

準 拠

strtok ()

POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.

strtok_r ()

POSIX.1-2001, POSIX.1-2008.

注 意

On some implementations, *saveptr is required to be NULL on the first call to strtok_r () that is being used to parse str .

バ グ

こ れ ら の 関 数 を 使 う の は 慎 重 に 吟 味 す る こ と 。 使 用 す る 場 合 は 、 以 下 の 点 に 注 意 が 必 要 で あ る 。

*

こ れ ら の 関 数 は そ の 最 初 の 引 数 を 変 更 す る 。

*

こ れ ら の 関 数 は 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;

if (argc != 4) {
fprintf(stderr, "Usage: %s string delim subdelim\n",
argv[0]);
exit(EXIT_FAILURE);
}

for (int 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 プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。