wcstok, wcstok_s
From cppreference.com
| ヘッダー <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にはトークンが1つしかなく、それ以降の
- 関数はその後、トークンの開始位置へのポインタを返します。
- もしstr == NULLであれば、この呼び出しは
wcstokの連続した呼び出しとして扱われます。関数は、前の呼び出しで中断した場所から、同じ*ptrを使用して処理を続行します。これは、最後に検出されたトークンの後のワイド文字へのポインタがstrとして渡されたかのように動作します。
- もしstr != NULLであれば、この呼び出しは、この特定のワイド文字列に対する
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__が定義され、ユーザーが<wchar.h>をインクルードする前に__STDC_WANT_LIB_EXT1__を整数定数1として定義した場合にのみ、利用が保証されます。
目次 |
[編集] パラメータ
| str | - | トークン化するヌル終端のワイド文字列へのポインタ |
| delim | - | 区切り文字を識別するヌル終端のワイド文字列へのポインタ |
| ptr | - | wcstokおよびwcstok_sがパーサーの内部状態を格納するために使用する、wchar_t*型のオブジェクトへのポインタ |
| 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 The wcstok function (p: 437-438)
- K.3.9.2.3.1 The wcstok_s function (p: 645-646)
- C99標準 (ISO/IEC 9899:1999)
- 7.24.4.5.7 The wcstok function (p: 383-384)
[編集] 関連項目
| (C11) |
バイト文字列内の次のトークンを見つける (関数) |
| C++ ドキュメント(wcstok)
| |