STRTOK(3) | Linux Programmer's Manual | STRTOK(3) |
名前
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() 関数は文字列を解析してトークンに分割する。 strtok() を最初に呼び出す際には、解析対象の文字列を str に指定する。同じ文字列の解析を行うその後の呼び出しでは、 str には NULL を指定する。返り値
strtok() と strtok_r() は次のトークンへのポインタか、トークンがなければ NULL を返す。準拠
- 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.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2012-05-10 | GNU |