Namespaces
Variants

wcstok, wcstok_s

ja.cppreference.net より
 
 
 
 
ヘッダー <wchar.h>
wchar_t* wcstok( wchar_t* str, const wchar_t* delim, wchar_t** ptr );
で定義されます。 (1) (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 にはトークンが一つだけであり、それ以降の wcstok の呼び出しはヌルポインタを返します。
  • そのようなワイド文字が見つかった場合、それはナルワイド文字 に置き換えられL'\0'、パーサーの状態(通常は後続のワイド文字へのポインタ)がユーザー提供の場所 *ptr に格納されます。
  • 関数は、トークンの先頭へのポインタを返します。
  • もし str == NULL の場合、呼び出しは wcstok への後続の呼び出しとして扱われます。関数は、前回の同一の *ptr に対する呼び出しで中断したところから続行します。動作は、最後に検出されたトークンの後ろのワイド文字へのポインタが str として渡された場合と同じです。
2) (1) と同じですが、各ステップで、検査対象の残りの文字数を str に書き込みます。繰り返し呼び出し(ヌル *strmax の場合)では、前回の呼び出しで格納された値を str と strmax の両方に渡さなければなりません。また、以下のエラーが実行時に検出され、現在インストールされている ptr制約ハンドラ 関数を呼び出し、、ptr
  • strmax、または delim がヌルポインタの場合、ptr が指すオブジェクト、
  • には何も格納しません。str非最初の呼び出し(ヌル *ptr の場合)では、
  • はヌルポインタです。*strmax最初の呼び出しでは、RSIZE_MAX / sizeof(wchar_t)
  • はゼロか *strmax よりも大きい値です。トークンの終端を探しているときに、ナル終端文字に遭遇することなくソース文字列の終端(
の初期値で測定)に達した場合。 すべての境界チェック関数と同様に、wcstok_s は、実装によって __STDC_LIB_EXT1__ が定義されており、且つユーザーが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義してから <wchar.h> をインクルードした場合にのみ利用可能であることが保証されます。

パラメータ

str - トークン化するNULL終端ワイド文字列へのポインタ
delim - 区切り文字を指定するNULL終端ワイド文字列へのポインタ
ptr - wchar_t * 型のオブジェクトへのポインタ。 wcstok と wcstok_s の両方でパーサーの内部状態を保存するために使用される
strmax - 初期状態で str のサイズを保持するオブジェクトへのポインタ:wcstok_sは未処理の残り文字数を保存する

戻り値

次のトークンの先頭へのポインタを返します。トークンがこれ以上存在しない場合はヌルポインタを返します。

注記

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

strtok とは異なり、 wcstok は静的ストレージを更新しません:パーサーの状態をユーザー提供の場所に保存します。

他のほとんどのトークナイザとは異なり、 wcstok の区切り文字は、後続の各トークンごとに異なる場合があり、前のトークンの内容に依存することさえあります。

Windows CRTにおける wcstok_s の実装はC標準に準拠しておらず、 wcstok の単なるエイリアスでしかありません。

例

#include <stdio.h>
#include <wchar.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規格 (ISO/IEC 9899:2011):
  • 7.29.4.5.7 wcstok関数 (p: 437-438)
  • K.3.9.2.3.1 wcstok_s関数 (p: 645-646)
  • C99規格 (ISO/IEC 9899:1999):
  • 7.24.4.5.7 wcstok関数 (p: 383-384)

関連項目

バイト文字列内の次のトークンを検索する
(関数)