strtok、_strtok_l、wcstok、_wcstok_l、_mbstok、_mbstok_lstrtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l

現在のロケールまたは渡された指定のロケールを使用して、文字列内の次のトークンを検索します。Finds the next token in a string, by using the current locale or a specified locale that's passed in. これらの関数にはセキュリティが強化されたバージョンがあります。「strtok_s、_strtok_s_l、wcstok_s、_wcstok_s_l、_mbstok_s、_mbstok_s_l」を参照してください。More secure versions of these functions are available; see strtok_s, _strtok_s_l, wcstok_s, _wcstok_s_l, _mbstok_s, _mbstok_s_l.


_mbstok_mbstok_l は、Windows ランタイムで実行されるアプリケーションでは使用できません。_mbstok and _mbstok_l cannot be used in applications that execute in the Windows Runtime. 詳細については、「ユニバーサル Windows プラットフォーム アプリでサポートされていない CRT 関数」を参照してください。For more information, see CRT functions not supported in Universal Windows Platform apps.


char *strtok(
   char *strToken,
   const char *strDelimit
char *strtok_l(
   char *strToken,
   const char *strDelimit,
   _locale_t locale
wchar_t *wcstok(
   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


トークンを含む文字列。String containing token or tokens.

区切り記号文字のセット。Set of delimiter characters.

使用するロケール。Locale to use.

パーサーの内部状態を格納するために使用されるメモリを指します。これにより、次に wcstok を呼び出すときに、パーサーは中断した場所から続行できます。Points to memory used to store the internal state of the parser so that the parser can continue from where it left off the next time you call wcstok.

戻り値Return Value

StrToken で見つかった次のトークンへのポインターを返します。Returns a pointer to the next token found in strToken. これらの関数は、トークンが見つからない場合は NULL を返します。The functions return NULL when no more tokens are found. 各呼び出しは、返されたトークンの後に出現する最初の区切り記号として null 文字を置換することで、 strToken を変更します。Each call modifies strToken by substituting a null character for the first delimiter that occurs after the returned token.


Strtok 関数は、 strToken 内の次のトークンを検索します。The strtok function finds the next token in strToken. Strdelimit の文字セットは、現在の呼び出しの strToken にあるトークンの有効な区切り記号を指定します。The set of characters in strDelimit specifies possible delimiters of the token to be found in strToken on the current call. wcstok_mbstok は、 strtok のワイド文字バージョンとマルチバイト文字バージョンです。wcstok and _mbstok are wide-character and multibyte-character versions of strtok. Wcstok の引数と戻り値はワイド文字列です。これらの _mbstok はマルチバイト文字列です。The arguments and return value of wcstok are wide-character strings; those of _mbstok are multibyte-character strings. それ以外では、これらの関数の動作は同じです。These three functions behave identically otherwise.

Wcstok の2つの引数のバージョンは標準ではありません。The two argument version of wcstok is not standard. このバージョンを使用する必要がある場合は、 _CRT_NON_CONFORMING_WCSTOK (または) の前にを定義する必要があり #include <wchar.h> #include <string.h> ます。If you need to use that version, you'll need to define _CRT_NON_CONFORMING_WCSTOK before you #include <wchar.h> (or #include <string.h>).


これらの関数は、バッファー オーバーランが原因で発生する可能性のある問題の影響を受けます。These functions incur a potential threat brought about by a buffer overrun problem. バッファー オーバーランは、システムを攻撃するときによく使用される方法であり、その結果、認められていない権限が昇格されます。Buffer overrun problems are a frequent method of system attack, resulting in an unwarranted elevation of privilege. 詳しくは、「 バッファー オーバーランの回避」をご覧ください。For more information, see Avoiding Buffer Overruns.

Strtok の最初の呼び出しでは、関数は先頭の区切り記号をスキップし、 strToken の最初のトークンへのポインターを返し、null 文字でトークンを終了します。On the first call to strtok, the function skips leading delimiters and returns a pointer to the first token in strToken, terminating the token with a null character. StrToken の残りの部分から、 strtok の一連の呼び出しによって、より多くのトークンを分割できます。More tokens can be broken out of the remainder of strToken by a series of calls to strtok. Strtok を呼び出すたびに、その呼び出しによって返された トークン の後に null 文字を挿入することによって strToken が変更されます。Each call to strtok modifies strToken by inserting a null character after the token returned by that call. StrToken から次のトークンを読み取るには、 StrToken 引数に NULL 値を指定して strtok を呼び出します。To read the next token from strToken, call strtok with a NULL value for the strToken argument. NULLstrToken 引数を指定すると、 strtok は、変更された strToken 内の次のトークンを検索します。The NULL strToken argument causes strtok to search for the next token in the modified strToken. Strdelimit 引数は、区切り記号のセットが異なる可能性があるため、次の呼び出しのいずれかの値を受け取ることができます。The strDelimit argument can take any value from one call to the next so that the set of delimiters may vary.

出力値は、ロケールの LC_CTYPE カテゴリの設定に影響されます。The output value is affected by the setting of the LC_CTYPE category setting of the locale. 詳細については、「setlocale」をご覧ください。For more information, see setlocale.

_L サフィックスが付いていないこれらの関数のバージョンは、このロケールに依存する動作に現在のロケールを使用します。The versions of these functions without the _l suffix use the current locale for this locale-dependent behavior. _L サフィックスが付いているバージョンは、渡されたロケールパラメーターを代わりに使用する点を除いて同じです。The versions with the _l suffix are identical except that they use the locale parameter passed in instead. 詳細については、「 Locale」を参照してください。For more information, see Locale.


各関数は、文字列をトークンに解析する際にスレッド ローカルの静的変数を使用します。Each function uses a thread-local static variable for parsing the string into tokens. したがって、複数のスレッドが望ましくない影響を受けずに同時にこれらの関数を呼び出すことができます。Therefore, multiple threads can simultaneously call these functions without undesirable effects. ただし、1 つのスレッド内でこれらの関数のいずれかの呼び出しをインターリーブすると、データの破損や正確でない結果が生成される可能性が非常に高くなります。However, within a single thread, interleaving calls to one of these functions is highly likely to produce data corruption and inaccurate results. さまざまな文字列を解析する際、1 つの文字列の解析を完了してから、次の解析を開始します。When parsing different strings, finish parsing one string before starting to parse the next. また、別の関数が呼び出されているループから、これらの関数の 1 つを呼び出す場合の危険性にも注意してください。Also, be aware of the potential for danger when calling one of these functions from within a loop where another function is called. 他の関数が最終的にこれらの関数の 1 つを使用した場合、インターリーブされた呼び出しのシーケンスにより、データの破損を招くことがあります。If the other function ends up using one of these functions, an interleaved sequence of calls will result, triggering data corruption.

既定では、この関数のグローバル状態はアプリケーションにスコープが設定されています。By default, this function's global state is scoped to the application. これを変更するには、「 CRT でのグローバル状態」を参照してください。To change this, see Global state in the CRT.

汎用テキスト ルーチンのマップGeneric-Text Routine Mappings

TCHAR.H のルーチンTCHAR.H routine _UNICODE および _MBCS が未定義の場合_UNICODE & _MBCS not defined _MBCS が定義されている場合_MBCS defined _UNICODE が定義されている場合_UNICODE defined
_tcstok_tcstok strtokstrtok _mbstok_mbstok wcstokwcstok
_tcstok_tcstok _strtok_l_strtok_l _mbstok_l_mbstok_l _wcstok_l_wcstok_l


ルーチンによって返される値Routine 必須ヘッダーRequired header
strtokstrtok <string.h>
wcstokwcstok <string.h> または <wchar.h><string.h> or <wchar.h>
_wcstok_l_wcstok_l <tchar.h><tchar.h>
_mbstok_mbstok_l_mbstok, _mbstok_l <mbstring.h>

互換性の詳細については、「互換性」を参照してください。For additional compatibility information, see 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

関連項目See also

文字列操作String Manipulation
Multibyte-Character シーケンスの解釈Interpretation of Multibyte-Character Sequences
strcspn、wcscspn、_mbscspn、_mbscspn_lstrcspn, wcscspn, _mbscspn, _mbscspn_l
strspn、wcsspn、_mbsspn、_mbsspn_lstrspn, wcsspn, _mbsspn, _mbsspn_l