strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l

使用目前的地區設定或傳入的指定地區設定,在字串中尋找下一個 Token。 這些函式有更安全的版本可供使用;請參閱 、、 _strtok_s_l_wcstok_s_lwcstok_s_mbstok_s_mbstok_s_lstrtok_s

重要

在 Windows 執行階段中執行的應用程式中無法使用 _mbstok_mbstok_l。 如需詳細資訊,請參閱 CRT functions not supported in Universal Windows Platform apps (通用 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
包含一或多個 Token 的字串。

strDelimit
分隔符號字元集。

locale
要使用的地區設定。

context
指向用來儲存剖析器內部狀態的記憶體,以便剖析器可以在下次呼叫 wcstok 時從中斷的位置繼續。

傳回值

傳回在 strToken 中找到之下一個 Token 的指標。 找不到其他權杖時,函式會傳回 NULL 。 每個呼叫都會 strToken 藉由取代傳回標記之後發生的第一個分隔符號的 Null 字元來修改。

備註

strtok 函式會在 strToken 中尋找下一個 Token。 strDelimit 中的字元集會指定目前呼叫要在 strToken 中尋找的可能 Token 分隔符號。 wcstok_mbstok 分別是 strtok 的寬字元版本和多位元組字元版本。 的引數和傳回值 wcstok 是寬字元字串。 的引數和傳回值 _mbstok 是多位元組字元字串。 除此之外,這三個函式的行為相同。

的兩個引數版本 wcstok 不是標準的。 如果您需要使用該版本,您必須在 (或 #include <string.h> ) 之前 #include <wchar.h> 定義 _CRT_NON_CONFORMING_WCSTOK

重要

這些函式可能會帶來因緩衝區滿溢問題所引發的威脅。 緩衝區滿溢問題是系統攻擊常見的方法,會造成權限無故提高。 如需詳細資訊,請參閱 避免緩衝區滿溢

第一次呼叫 strtok 時,函式會略過前導分隔符號,並傳回 strToken 中第一個 Token 的指標,終止具有 Null 字元的 Token。 一連串的 strtok 呼叫可以中斷超出 strToken 剩餘部分的多個 Token。 在呼叫傳回的 後面 token 插入 Null 字元,以 strtok 修改 strToken 每個呼叫。 若要讀取 strToken 的下一個 Token,請以 strToken 引數的 NULL 值呼叫 strtokNULLstrToken 引數會令 strtok 在修改過的 strToken 中搜尋下一個 Token。 strDelimit 引數可以接受呼叫與呼叫之間的任何值,所以分隔符號集可能會有所不同。

輸出值會受到 LC_CTYPE 地區設定之類別設定的影響。 如需詳細資訊,請參閱setlocale

沒有 _l 尾碼的這些函式版本會針對這個地區設定相依的行為使用目前的地區設定。 後 _l 置詞的版本完全相同,不同之處在于它們會改用傳入的地區設定參數。 如需詳細資訊,請參閱 Locale

注意

每個函式都會使用執行緒區域靜態變數將字串剖析為 Token。 因此,多個執行緒可以同時呼叫這些函式,卻不會有意外作用。 但在單一執行緒內,交錯呼叫這些函式的其中之一,非常有可能產生資料損毀或不正確的結果。 剖析不同的字串時,請先完成一個字串的剖析再開始剖析下一個。 亦請注意,從呼叫另一個函式的迴圈內呼叫這些函式的其中之一時,會有潛在的危險。 如果其他函式在使用這些函式的其中之一時結束,就會導致交錯的呼叫順序,觸發資料損毀。

根據預設,此函式的全域狀態會限定于應用程式。 若要變更此行為,請參閱 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>

如需相容性詳細資訊,請參閱相容性

範例

// 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