名前空間
変種
操作

wcstok, wcstok_s

提供: cppreference.com
< c‎ | string‎ | wide
ヘッダ <wchar.h> で定義
(1)
wchar_t* wcstok( wchar_t* str, const wchar_t* delim, wchar_t **ptr );
(C95およびそれ以降)
(C99以前)
wchar_t *wcstok(wchar_t * restrict str, const wchar_t * restrict delim,
                wchar_t **restrict ptr);
(C99およびそれ以降)
wchar_t *wcstok_s( wchar_t *restrict str, rsize_t *restrict strmax,
                   const wchar_t *restrict delim, wchar_t **restrict ptr);
(2) (C11およびそれ以降)
1) str の指すヌル終端ワイド文字列内の次のトークンを探します。 区切り文字は delim の指すヌル終端ワイド文字列によって表されます。
この関数は同じ文字列から連続するトークンを取得するために複数回呼ばれるように設計されています。
  • str != NULL の場合、その呼び出しはこの特定のワイド文字列に対する wcstok の初回の呼び出しとして扱われます。 delim に含まれない最初のワイド文字を検索します。
  • そのようなワイド文字が見つからなかった場合、 str にはトークンがまったくなく、ヌルポインタが返されます。
  • そのようなワイド文字が見つかった場合、それは「トークンの開始位置」です。 その位置から delim に含まれ最初のワイド文字を検索します。
  • そのようなワイド文字が見つからなかった場合、 str はトークンを1個だけ持ち、 wcstok の以後の呼び出しはヌルポインタを返します。
  • そのようなワイド文字が見つかった場合、それはヌルワイド文字 L'\0'置き換えられ、解析状態 (一般的にはその次のワイド文字を指すポインタ) がユーザ提供の位置 *ptr に格納されます。
  • その後、トークンの開始位置を指すポインタが返されます。
  • str == NULL の場合、その呼び出しは wcstok の2回目以降の呼び出しとして扱われます。 この関数は前回同じ *ptr で呼び出した残りの場所から続きを行います。 前回検出されたトークンの次のワイド文字を指すポインタが str に渡されたかのように動作します。
2) (1) と同じですが、ステップごとに str 内の残りの文字数を *strmax に書き込みます。 繰り返しの呼び出し (str がヌル) は前回の呼び出しで格納された値を持つ strmax および ptr を渡さなければなりません。 また、以下のエラーが実行時に検出され、 ptr の指すオブジェクトに何も格納せずに現在設定されている制約ハンドラ関数を呼びます。
  • strmaxdelim または ptr がヌルポインタ。
  • 2回目以降の呼び出し (str がヌル) で、 *ptr がヌルポインタ。
  • 初回の呼び出しで、 *strmax がゼロまたは RSIZE_MAX より大きい。
  • トークンの終端の検索がヌル終端に遭遇せずにソース文字列の終端 (*strmax の初期値によって表される) に達した。
すべての境界チェック付き関数と同様に、 wcstok_s__STDC_LIB_EXT1__ が処理系によって定義されていて、 <wchar.h> をインクルードする前にユーザが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ、利用可能であることが保証されます。

目次

[編集] 引数

str - トークン化するヌル終端ワイド文字列を指すポインタ
delim - 区切り文字を表すヌル終端ワイド文字列を指すポインタ
ptr - パーサの内部状態を格納するために wcstok および wcstok_s が使用する wchar_t* 型のオブジェクトを指すポインタ
strmax - 初期状態で str のサイズを保持するオブジェクトを指すポインタ。 wcstok_s が調べる残りの文字数を格納します

[編集] 戻り値

次のトークンの開始位置を指すポインタ、またはこれ以上トークンがなければヌルポインタ。

[編集] ノート

この関数は破壊的です。 文字列 str の要素に L'\0' 文字を書き込みます。 特に、ワイド文字列リテラルを wcstok の第1引数として使用することはできません。

strtok と異なり、 strtok は静的記憶域を更新しません。 解析状態はユーザ定義の位置に格納されます。

他のほとんどのトークナイザと異なり、 wcstok の区切り文字はトークンごとに異なってもよく、前のトークンの内容に依存することもできます。

[編集]

#include <wchar.h>
#include <stdio.h>
 
int main(void)
{
    wchar_t input[] = L"A bird came down the walk";
    printf("Parsing the input string '%ls'\n", input);
    wchar_t *buffer;
    wchar_t *token = wcstok(input, L" ", &buffer);
    while(token) {
        printf("%ls\n", token);
        token = wcstok(NULL, L" ", &buffer);
    }
 
    printf("Contents of the input string now: '");
    for(size_t n = 0; n < sizeof input / sizeof *input; ++n)
        input[n] ? printf("%lc", input[n]) : printf("\\0");
    puts("'");
}

出力:

Parsing the input string 'A bird came down the walk'
A
bird
came
down
the
walk
Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0'

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.29.4.5.7 The wcstok function (p: 437-438)
  • K.3.9.2.3.1 The wcstok_s function (p: 645-646)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.24.4.5.7 The wcstok function (p: 383-384)

[編集] 関連項目

バイト文字列中の次のトークンを探します
(関数) [edit]