strtok、_strtok_l、wcstok、_wcstok_l、_mbstok、_mbstok_l
渡された現在のロケールまたは指定されたロケールを使用して文字列の次のトークンを検索します。これらの関数のセキュリティを強化したバージョンについては、「strtok_s、_strtok_s_l、wcstok_s、_wcstok_s_l、_mbstok_s、_mbstok_s_l」を参照してください。
重要 |
---|
_mbstok と _mbstok_l は、Windows のランタイムで実行するアプリケーションで使用することはできません。詳細については、でサポート /ZW CRT 関数" "を参照してください。 |
char *strtok(
char *strToken,
const char *strDelimit
);
wchar_t *wcstok(
wchar_t *strToken,
const wchar_t *strDelimit
);
unsigned char *_mbstok(
unsigned char*strToken,
const unsigned char *strDelimit
);
unsigned char *_mbstok(
unsigned char*strToken,
const unsigned char *strDelimit,
_locale_t locale
);
strToken
トークンを含む文字列。strDelimit
区切り記号文字のセット。locale
使用するロケール。
strTokenにある次のトークンへのポインターを返します。これらはこれ以上のトークンがない場合 NULL を返します。各呼び出しは、返されたトークンの後に発生最初の区切り記号 NULL の文字に置き換えることで strToken を変更します。
strtok 関数は strTokenの次のトークンを検索します。strDelimit の文字セットは現在の呼び出しの strToken で検索するトークンの可能な区切り記号を指定します。wcstok 関数と _mbstok 関数は、strtok 関数のワイド文字バージョンとマルチバイト文字バージョンです。wcstok 関数の引数と戻り値はワイド文字列で、_mbstok 関数の引数と戻り値はマルチバイト文字列です。それ以外では、これらの関数の動作は同じです。
セキュリティに関するメモ |
---|
これらの関数は、バッファー オーバーランが原因で発生する可能性のある問題の影響を受けます。バッファー オーバーランは、システムを攻撃するときによく使用される方法であり、その結果、認められていない権限が昇格されます。詳細については、「Avoiding Buffer Overruns」を参照してください。 |
strtokへの最初の呼び出しでは、関数は最上位の区切り記号を使用しないで、null 文字を含むトークンを終了する strTokenの最初のトークンへのポインターを返します。詳細に strtokトークンはに一連の呼び出しによって strToken の残りの作成できます。strtokに対する各呼び出しは、その呼び出しによって返される token の後に null 文字を挿入して strToken を変更します。strTokenから次のトークンを読み取るには、strToken の引数の NULL の値を持つ strtok を呼び出します。NULLstrToken の引数により strtok が変更された strTokenの次のトークンを検索します。strDelimit の引数は区切り記号のセットが異なるように、1 種類の呼び出しから次の値を設定できます。
出力値は、ロケールの LC_CTYPE カテゴリの設定で決まります。詳細については、「setlocale」を参照してください。_l サフィックスが付いていないこの関数のバージョンでは、このロケールに依存する動作に現在のロケールを使用します。_l サフィックスが付いているバージョンは、渡されたロケール パラメーターを代わりに使用する点を除いて同じです。詳細については、「ロケール」を参照してください。
[!メモ]
各関数はトークンに文字列を解析するスレッド ローカルの静的変数を使用します。したがって、複数のスレッドが望ましくない影響なしで同時にこれらの関数を呼び出すことができます。ただし、一つのスレッド内でデータの破損、不正な結果が生成される場合、これらの関数の 1 回の呼び出しをインタリーブ非常に高くなります。分析、次の異なる文字列を解析する開始する前に 1 文字列を解析する終了したとき。またはで呼び出した場合、別の関数を呼び出すループからこれらの関数の 1 種類を、リスクの可能性に注意してください。他の関数がこれらの関数の 1 種類を使用して行きつけば、インタリーブ呼び出しのシーケンスが発生しました、データの破損をトリガーします。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tcstok |
strtok |
_mbstok |
wcstok |
_tcstok |
_strtok_l |
_mbstok_l |
_wcstok_l |
ルーチン |
必須ヘッダー |
---|---|
strtok |
<string.h> |
wcstok |
<string.h> または <wchar.h> |
_mbstok, _mbstok_l |
<mbstring.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
// crt_strtok.c
// compile with: /W3
// In this program, a loop uses strtok
// to print all the tokens (separated by commas
// or blanks) in the string named "string".
//
#include <string.h>
#include <stdio.h>
char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;
int main( void )
{
printf( "Tokens:\n" );
// Establish string and get the first token:
token = strtok( string, seps ); // C4996
// Note: strtok is deprecated; consider using strtok_s instead
while( token != NULL )
{
// While there are tokens in "string"
printf( " %s\n", token );
// Get next token:
token = strtok( NULL, seps ); // C4996
}
}
該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。