strtok_s
、、_strtok_s_l
wcstok_s
、_wcstok_s_l
、、_mbstok_s
、_mbstok_s_l
使用目前的地區設定或傳入的地區設定,在字串中尋找下一個 Token。 這些版本的、 、 、 wcstok
、 _mbstok
_wcstok_l
具有_mbstok_l
安全性增強功能,如 CRT 的安全性功能中所述。 _strtok_l
strtok
重要
在 Windows 執行階段中執行的應用程式中無法使用 _mbstok_s
和 _mbstok_s_l
。 如需詳細資訊,請參閱 CRT functions not supported in Universal Windows Platform apps (通用 Windows 平台應用程式中不支援的 CRT 函式)。
語法
char* strtok_s(
char* str,
const char* delimiters,
char** context
);
char* _strtok_s_l(
char* str,
const char* delimiters,
char** context,
_locale_t locale
);
wchar_t* wcstok_s(
wchar_t* str,
const wchar_t* delimiters,
wchar_t** context
);
wchar_t *_wcstok_s_l(
wchar_t* str,
const wchar_t* delimiters,
wchar_t** context,
_locale_t locale
);
unsigned char* _mbstok_s(
unsigned char* str,
const unsigned char* delimiters,
char** context
);
unsigned char* _mbstok_s_l(
unsigned char* str,
const unsigned char* delimiters,
char** context,
_locale_t locale
);
參數
str
包含要尋找之令牌或令牌的字串。
delimiters
要使用的分隔符集。
context
用來儲存函式呼叫之間的位置資訊。
locale
要使用的地區設定。
傳回值
傳回在 str
中找到之下一個 Token 的指標。 NULL
找不到任何權杖時傳回 。 每個呼叫都會 str
藉由取代傳回標記之後發生的第一個分隔符的 Null 字元來修改。
錯誤條件
str |
delimiters |
context |
傳回值 | errno |
---|---|---|---|---|
NULL |
任意 | Null 指標的指標 | NULL |
EINVAL |
任意 | NULL |
任意 | NULL |
EINVAL |
任意 | 任意 | NULL |
NULL |
EINVAL |
如果 str
是 NULL
,但 context
為有效內容指標的指標,則不會有任何錯誤。
備註
函 strtok_s
式系列會在 中 str
尋找下一個令牌。 delimiters
中的字元集會指定目前呼叫要在 str
中尋找的可能 Token 分隔符號。 wcstok_s
和 _mbstok_s
分別是 strtok_s
的寬字元版本和多位元組字元版本。 和的wcstok_s
_wcstok_s_l
自變數和傳回值都是寬字元字串。 和的_mbstok_s
_mbstok_s_l
自變數和傳回值是多位元組位元元字串。 除此之外,這些函式的行為相同。
這個函式會驗證它的參數。 發生錯誤條件時,如錯誤條件數據表所示,會叫用無效的參數處理程式,如參數驗證中所述。 如果允許繼續執行,這些函式會將 errno
設為 EINVAL
,並傳回 NULL
。
第一次呼叫 strtok_s
時,函式會略過前導分隔符號,並傳回 str
中第一個 Token 的指標,終止具有 Null 字元的 Token。 一連串的 strtok_s
呼叫可以中斷超出 str
剩餘部分的多個 Token。 只要在該呼叫傳回的 Token 後面插入一個 Null 字元,每次呼叫 strtok_s
都會修改 str
。 context
指標會追蹤正在讀取的字串,且該字串中的下一個 Token 要被讀取。 若要讀取 str
的下一個 Token,請以 str
引數的 NULL
值呼叫 strtok_s
,並傳遞相同的 context
參數。 自NULL
str
變數會導致strtok_s
在修改str
的 中搜尋下一個標記。 delimiters
引數可以接受呼叫與呼叫之間的任何值,所以分隔符號集可能會有所不同。
context
由於 參數會取代 和 _strtok_l
中使用的strtok
靜態緩衝區,因此可以在相同的線程中同時剖析兩個字元串。
輸出值會受到設定地區設定之 LC_CTYPE
類別設定的影響。 如需詳細資訊,請參閱setlocale
。
沒有 _l
後綴的這些函式版本會針對這個地區設定相依的行為使用目前的線程地區設定。 後 _l
置詞的版本完全相同,不同之處在於改用 參數所 locale
指定的地區設定。 如需詳細資訊,請參閱 Locale。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
一般文字常式對應
TCHAR.H 常式 |
_UNICODE 和 _MBCS 未定義 |
_MBCS 已定義 |
_UNICODE 已定義 |
---|---|---|---|
_tcstok_s |
strtok_s |
_mbstok_s |
wcstok_s |
_tcstok_s_l |
_strtok_s_l |
_mbstok_s_l |
_wcstok_s_l |
需求
常式 | 必要的標頭 |
---|---|
strtok_s |
<string.h> |
_strtok_s_l |
<string.h> |
wcstok_s ,_wcstok_s_l |
<string.h> 或 <wchar.h> |
_mbstok_s ,_mbstok_s_l |
<mbstring.h> |
如需相容性詳細資訊,請參閱相容性。
範例
// crt_strtok_s.c
// In this program, a loop uses strtok_s
// to print all the tokens (separated by commas
// or blanks) in two strings at the same time.
#include <string.h>
#include <stdio.h>
char string1[] =
"A string\tof ,,tokens\nand some more tokens";
char string2[] =
"Another string\n\tparsed at the same time.";
char seps[] = " ,\t\n";
char *token1 = NULL;
char *token2 = NULL;
char *next_token1 = NULL;
char *next_token2 = NULL;
int main(void)
{
printf("Tokens:\n");
// Establish string and get the first token:
token1 = strtok_s(string1, seps, &next_token1);
token2 = strtok_s(string2, seps, &next_token2);
// While there are tokens in "string1" or "string2"
while ((token1 != NULL) || (token2 != NULL))
{
// Get next token:
if (token1 != NULL)
{
printf(" %s\n", token1);
token1 = strtok_s(NULL, seps, &next_token1);
}
if (token2 != NULL)
{
printf(" %s\n", token2);
token2 = strtok_s(NULL, seps, &next_token2);
}
}
}
Tokens:
A
Another
string
string
of
parsed
tokens
at
and
the
some
same
more
time.
tokens
另請參閱
字串操作
地區設定
多位元組字元序列的解譯
strcspn
、 、 wcscspn
、 _mbscspn
_mbscspn_l
strspn
、 、 wcsspn
、 _mbsspn
_mbsspn_l