wcstok, wcstok_s
提供: cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
| ヘッダ <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 の指すオブジェクトに何も格納せずに現在設定されている制約ハンドラ関数を呼びます。
strmax、delimまたは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 の区切り文字はトークンごとに異なってもよく、前のトークンの内容に依存することもできます。
例
Run this code
#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)
関連項目
(C11) |
バイト文字列中の次のトークンを探します (関数) |
wcstok の C++リファレンス
| |