strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l

現在のロケールまたは渡された指定のロケールを使用して、文字列内の次のトークンを検索します。 これらの関数のセキュリティを強化したバージョンを使用できます。「strtok_s_strtok_s_lwcstok_s_wcstok_s_l_mbstok_s_mbstok_s_l」を参照してください。

重要

_mbstok および _mbstok_l は、Windows ランタイムで実行するアプリケーションでは使用できません。 詳細については、「ユニバーサル Windows プラットフォーム アプリでサポートされていない CRT 関数」を参照してください。

構文

char *strtok(
   char *strToken,
   const char *strDelimit
);
char *_strtok_l(
   char *strToken,
   const char *strDelimit,
   _locale_t locale
);
wchar_t *wcstok( /* Non-standard, define _CRT_NON_CONFORMING_WCSTOK to use */
   wchar_t *strToken,
   const wchar_t *strDelimit
);
wchar_t *wcstok(
   wchar_t *strToken,
   const wchar_t *strDelimit,
   wchar_t **context
);
wchar_t *_wcstok_l(
   wchar_t *strToken,
   const wchar_t *strDelimit,
   _locale_t locale
);
unsigned char *_mbstok(
   unsigned char *strToken,
   const unsigned char *strDelimit
);
unsigned char *_mbstok_l(
   unsigned char *strToken,
   const unsigned char *strDelimit,
   _locale_t locale
);

パラメーター

strToken
トークンを含む文字列。

strDelimit
区切り記号文字のセット。

locale
使用するロケール。

context
次回 wcstok を呼び出したとき、中断した場所からパーサーが続行できるようにパーサーの内部状態を格納するために使用されるメモリを指します。

戻り値

strToken で見つかった次のトークンへのポインターを返します。 それ以上トークンが見つからない場合、これらの関数は NULL を返します。 呼び出しのたびに、返されるトークンの後に現れる最初の区切り記号を null 文字に置き換えることで strToken が変更されます。

解説

strtok 関数は strToken の次のトークンを検索します。 strDelimit の文字セットは、現在の呼び出しの strToken で検索されたトークンの使用可能な区切り記号を指定します。 wcstok 関数と _mbstok 関数は、strtok 関数のワイド文字バージョンとマルチバイト文字バージョンです。 引数と戻り値 wcstok はワイド文字列です。 引数と戻り値 _mbstok はマルチバイト文字列です。 それ以外では、これらの関数の動作は同じです。

2 つの引数バージョン wcstok は標準ではありません。 そのバージョンを使用する必要がある場合は、#include <wchar.h> (または #include <string.h>) の前に _CRT_NON_CONFORMING_WCSTOK を定義する必要があります。

重要

これらの関数は、バッファー オーバーランが原因で発生する可能性のある問題の影響を受けます。 バッファー オーバーランは、システムを攻撃するときによく使用される方法であり、その結果、認められていない権限が昇格されます。 詳細については、「バッファー オーバーランの回避」を参照してください

strtok への最初の呼び出しで、関数は先行する区切り記号をスキップし、strToken の最初のトークンへのポインターを返して null 文字を含むトークンを終了します。 strToken への一連の呼び出しにより、より多くのトークンを strtok の残りから作成できます。 strtok の呼び出しのたびに、その呼び出しによって返される token の後に null 文字を挿入することで strToken が変更されます。 strToken から次のトークンを読み込むには、strtokNULL 引数に strToken 値を使用して呼び出します。 NULLstrToken 引数により、strtok は変更された strToken で次のトークンを検索します。 strDelimit 引数は、ある呼び出しから次の呼び出しへ任意の値を取ることができるため、区切り記号のセットが異なる場合があります。

出力値は、ロケールの LC_CTYPE カテゴリ設定の設定によって影響を受けます。 詳細については、setlocaleを参照してください。

これらの関数の _l サフィックスのないバージョンは、ロケールに依存するこの動作で現在のロケールを使用します。 _l サフィックスが付いているバージョンは、代わりに、渡されたロケール パラメーターを使用する点を除き同じです。 詳細については、「 Locale」を参照してください。

Note

各関数は、文字列をトークンに解析する際にスレッド ローカルの静的変数を使用します。 したがって、複数のスレッドが望ましくない影響を受けずに同時にこれらの関数を呼び出すことができます。 ただし、1 つのスレッド内でこれらの関数のいずれかの呼び出しをインターリーブすると、データの破損や正確でない結果が生成される可能性が非常に高くなります。 さまざまな文字列を解析する際、1 つの文字列の解析を完了してから、次の解析を開始します。 また、別の関数が呼び出されているループから、これらの関数の 1 つを呼び出す場合の危険性にも注意してください。 他の関数が最終的にこれらの関数の 1 つを使用した場合、インターリーブされた呼び出しのシーケンスにより、データの破損を招くことがあります。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT のグローバル状態」を参照してください

汎用テキスト ルーチンのマップ

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>
_wcstok_l <tchar.h>
_mbstok, _mbstok_l <mbstring.h>

互換性の詳細については、「 Compatibility」を参照してください。

// 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
   }
}
Tokens:
A
string
of
tokens
and
some
more
tokens

関連項目

文字列操作
ロケール
マルチバイト文字シーケンスの解釈
strcspn, wcscspn, _mbscspn, _mbscspn_l
strspn, wcsspn, _mbsspn, _mbsspn_l