strtok
読み:ストリ-トークン
外語:strtok
Cで、文字列からトークンを取り出すための関数。
書式
#include <string.h>
char *strtok(char *str, const char *delim);
概要
標準Cライブラリに含まれる、文字列操作関数の一つ。
入力した文字列(C標準のASCIIZ形式)から、指定した文字をデリミター(区切り文字)で区切って返す。一回の呼び出して一つを返すが、関数自体がどこまで処理したかを覚えているため、連続して呼び出すと順次、2番目、3番目…の結果を返す。
特徴
問題点
この関数は構文解析などの手間を省いてくれるが、使用するかどうか自体を含めた検討が必要である。
- 関数は、最初の引数 char *str の文字列を変更する (デリミター部分を NUL 文字に書き換える)
- つまり const な文字列に対しては使用できない (一旦 const でない場所に複写する必要がある)
- また、char *str から、区切り文字は消滅する
- 一つの解析が終わると、次に処理するポインターを静的変数に保持するため、スレッドセーフではない
これら問題点を許容した上で、再入不可能なこと、またはスレッドセーフではないことが問題となる場合は、strtok_r() 関数が利用できる。
定義
Bionicでは、次のように実装されている。
bionic/libc/include/string.h
extern char* strtok(char* __restrict, const char* __restrict);
bionic/libc/string/strtok.c
char *
strtok(char *s, const char *delim)
{
static char *last;
return strtok_r(s, delim, &last);
}
状態を保持するための変数を静的変数で確保している。それ以外の処理自体は strtok_r と全く同じであることが分かる。
再検索