2. C言語 - トークン取得 strok strsep - strtok_r

 
2.1 概要
2.2 使用例 ソース
2.3 使用例 Makefile
2.4 使用例 実行

2.1 概要


#include <string.h>

char *strtok(char *str, const char *sep);
char *strtok_r(char *str, const char *sep, char **last);
 冒頭で述べているように strtok は、スレッドセーフでないので strtok_r を使用します。

2.2 使用例 ソース

./strtok.c
 を作成して以下のように記述。

#include <limits.h>
#include <stdio.h>
#include <string.h>

#define DELIMITER   " \t"           //  デリミタ文字列

int main(int argc, char* argv[])
{
    char buff[PATH_MAX] = {};       //  元の文字列
    char *work;						//	トークン取得用ポインタ

    char *token;                    //  トークンのポインタ
    char *saveptr;                  //  処理用ポインタ

    snprintf(buff, sizeof(buff), "aaa bbb ccc");
    work = buff;

    token = strtok_r(work, DELIMITER, &saveptr);

    if (token == NULL)
    {
        return 0;
    }

    printf("%s\n", token);

    while(1)
    {
        token = strtok_r(NULL, DELIMITER, &saveptr);

        if (token == NULL)
        {
            break;
        }

        printf("%s\n", token);
    }

    return 0;
}
 トークンを取得する文字列は、const であってはならないし、第Ⅰ引数に与えたポインタは strtok_r で変更されますので、例のように定数値であっても snprintf のようにメモリに代入し、strtok_r に渡す引数は引数用のポインタを用意してあげるようにします。  初回の strtok_r 呼出し時はトークンを取得する文字列のポインタを第Ⅰ引数に設定します。  同じ文字列からトークンを取得する間は NULL を第Ⅰ引数に設定します。

2.3 使用例 Makefile

./Makefile
 を作成して以下のように記述。

.PHONY  = target
CC      = clang

target  : strtok.o Makefile
        $(CC) -O0 -g -o strtok strtok.o

.c.o    : Makefile
        $(CC) -O0 -g -c $< -o $@

2.4 使用例 実行

 make して実行すると以下の結果が得られます。

./strtok
aaa
bbb
ccc