strtok
、、_strtok_l
wcstok
、_wcstok_l
、、_mbstok
、_mbstok_l
使用目前的地區設定或傳入的指定地區設定,在字串中尋找下一個 Token。 這些函式已有更安全的版本可用,請參閱 strtok_s
、_strtok_s_l
、wcstok_s
、_wcstok_s_l
、_mbstok_s
、_mbstok_s_l
、。
重要
在 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
。
重要
這些函式可能會帶來因緩衝區滿溢問題所引發的威脅。 緩衝區滿溢問題是系統攻擊常見的方法,會造成權限無故提高。 如需詳細資訊,請參閱 Avoiding Buffer Overruns (避免緩衝區滿溢)。
第一次呼叫 strtok
時,函式會略過前導分隔符號,並傳回 strToken
中第一個 Token 的指標,終止具有 Null 字元的 Token。 一連串的 strtok
呼叫可以中斷超出 strToken
剩餘部分的多個 Token。 在呼叫傳回的 後面token
插入 Null 字元,以strtok
修改strToken
每個呼叫。 若要讀取 strToken
的下一個 Token,請以 strToken
引數的 NULL
值呼叫 strtok
。 自NULL
strToken
變數會導致strtok
在修改strToken
的 中搜尋下一個標記。 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