Namespaces
Variants

wcstok, wcstok_s

From cppreference.net
< 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 の後続の呼び出しとして扱われます:関数は前回の呼び出しで中断した位置から同じ * ptr を使用して継続します。この動作は、最後に検出されたトークンの次のワイド文字へのポインタが str として渡された場合と同じです。
2) (1)と同様であるが、各ステップで str 内に残っている文字数を * strmax に書き込む点が異なる。繰り返し呼び出し(nullの str を使用)では、前回の呼び出しで保存された値を持つ strmax ptr の両方を渡さなければならない。また、以下のエラーが実行時に検出され、オブジェクト ptr が指す先に何も保存せずに、現在インストールされている 制約ハンドラ 関数を呼び出す:
  • strmax delim または ptr がnullポインタである場合
  • 非初期呼び出し(nullの str を使用)で、 * ptr がnullポインタである場合
  • 最初の呼び出しで、 * strmax がゼロまたは RSIZE_MAX / sizeof ( wchar_t ) より大きい場合
  • トークンの終端の検索が、ソース文字列の終端(初期値 * strmax で計測)に達し、null終端文字が見つからない場合
すべての境界チェック付き関数と同様に、 wcstok_s は、実装によって __STDC_LIB_EXT1__ が定義され、かつユーザーが <wchar.h> を含める前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ利用可能であることが保証される。

目次

パラメータ

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)

関連項目

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