C 言語で strtok 関数を使用する
胡金庫
2023年10月12日
この記事では、C 言語での strtok
関数の使い方について複数の方法を示します。
与えられたデリミタで文字列をトークン化するために strtok
関数を使用する
関数 strtok
は <string.h>
ヘッダファイルで定義されている C 標準ライブラリの一部です。この関数は与えられた文字列を指定された区切り文字で分割されたトークンに分割します。strtok
は 2つの引数を取ります。1 番目の引数はトークン化する文字列へのポインタであり、2 番目の引数はデリミタ文字列です。区切り文字の文字列は文字の集合として処理され、別の区切り文字を示すことに注意してください。この関数は、次のトークンを表すヌル文字列へのポインタを返します。ただし、同じ文字列を複数回 strtok
を呼び出して解析する場合は、最初の関数呼び出しの後に最初のポインタの引数を NULL
にしなければならないことに注意してください。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str1, *token;
int j;
if (argc != 3) {
fprintf(stderr, "Usage: %s string delim\n", argv[0]);
exit(EXIT_FAILURE);
}
for (j = 1, str1 = argv[1];; j++, str1 = NULL) {
token = strtok(str1, argv[2]);
if (token == NULL) break;
printf("%d: %s\n", j, token);
}
exit(EXIT_SUCCESS);
}
サンプルコマンド
./program "Temporary string to be parsed" " "
出力:
1: Temporary
2: string
3: to
4: be
5: parsed
関数 strtok_r
を用いて 2つのデリミタを持つ文字列をトークン化する
あるいは、strtok_r
と呼ばれる別のバージョンの関数も利用できます。これらの関数はどちらも第一引数として渡された文字列を変更します。以下のコード例では、与えられた文字列を 2つのレベルの階層にトークン化しています。最初の階層は、プログラムの第 2 引数として渡されたデリミタ上で分割されたトークンで構成されています。内側のループは、最初のトークン化から各トークンを分割し、最後にプログラムは結果をコンソールに出力します。
#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);
}
サンプルコマンド
./program "Temporary string to be parsed" " " "aeio"
出力:
1: Temporary
--> T
--> mp
--> r
--> ry
2: string
--> str
--> ng
3: to
--> t
4: be
--> b
5: parsed
--> p
--> rs
--> d
著者: 胡金庫