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 への最初の呼び出しで、関数は先行する区切り記号をスキップし、strToken の最初のトークンへのポインターを返して null 文字を含むトークンを終了します。 strtok への一連の呼び出しにより、より多くのトークンを strToken の残りから作成できます。 strtokを呼び出すたびに、その呼び出しによって返される token の後に空白文字を挿入することで、strToken を変更します。 strToken から次のトークンを読み込むには、strtok を strToken 引数に NULL 値を使用して呼び出します。 NULL strToken 引数により、strtok は変更された strToken で次のトークンを検索します。 strDelimit 引数は、ある呼び出しから次の呼び出しへ任意の値を取ることができるため、区切り記号のセットが異なる場合があります。
出力値は、ロケールの 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> |
互換性の詳細については、「互換性」を参照してください。
使用例
// 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
}
}
同等の .NET Framework 関数
使用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。