文字列を区切り文字で分解する[C言語]
【書式】
#include <string.h>
char *strtok(char *s1, const char *s2);
【説明】
- 最初の呼び出しでは s1 には分解対象の文字列を指定します。トークンがあれば、strtok() はトークンへのポインタを返却します。
- 2回目以降の呼び出しでは s1 に NULL を指定します。分解できるトークンがあるうちは、strtok() はトークンへのポインタを返却します。
- トークンがなくなると strtok() は NULL を返却します。
strtok() はトークンへのポインタを返却しながら、分解対象文字列 s1 中の区切り文字に空文字(’\0’)を埋めていきます。ですから、s1 に文字列リテラルや変更されては困る文字列を指定してはいけません。
【引数】
char *s1 : 分解対象文字列
const char *s2 : 区切り文字群。複数の区切り文字を指定することが可能。
例えば ‘?’ と ‘/’と ‘!’ で区切りたいときには “?/!” と指定。
【戻り値】
トークンが見つかったとき : 字句(トークン)へのポインタ
トークンが見つからなかったとき : NULL
【使用例】
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "ABCD ef.1234.G";
char *tp;
/* スペース.を区切りに文字列を抽出 */
tp = strtok( str, " ." );
puts( tp );
while ( tp != NULL ) {
tp = strtok( NULL," ." );
if ( tp != NULL ) puts( tp );
}
return 0;
}
【実行結果】
ABCD ef 1234 G
【どのような動きでstrtok() が文字列をトークンに分解していくか】
上記の使用例で strtok() がどのように文字列を分解していくか、下図で確認してください。 strtok() は空文字(‘\0)を区切り文字に埋めることにより、次々に文字列からトークンを取り出していきます。
- strtok()呼び出し前

- strtok() 1回目呼出し : tp = strtok(str, ” .” ); ※s1 には分解対象の文字列を指定
strtok() は区切り文字に’\0’を設定
- strtok() 2回目呼出し : tp = strtok(NULL, ” .” ); ※s1 にはNULLを指定
strtok() は次の区切り文字に’\0’を設定
- strtok() 3回目呼出し : tp = strtok(NULL, ” .” );
strtok() は次の区切り文字に’\0’を設定
- strtok() 4回目呼出し : tp = strtok(NULL, ” .” );

- strtok() 5回目呼び出し : tp = strtok(NULL, ” .” );
strtok() は分解するトークンがないので、tp に NULL を返却
引用:http://www9.plala.or.jp/sgwr-t/lib/strtok.html

