Share via


strtok_s, _strtok_s_l, wcstok_s, _wcstok_s_l, _mbstok_s, _mbstok_s_l

使用目前的地區設定或傳入的地區設定,在字串中尋找下一個 Token。 這些版本的 strtok_strtok_lwcstok_wcstok_l_mbstok 具有 _mbstok_l 安全性增強功能,如 CRT 的安全性功能中所述

重要

在 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

如果 strNULL ,但 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 都會修改 strcontext 指標會追蹤正在讀取的字串,且該字串中的下一個 Token 要被讀取。 若要讀取 str 的下一個 Token,請以 str 引數的 NULL 值呼叫 strtok_s,並傳遞相同的 context 參數。 NULLstr 引數會令 strtok_s 在修改過的 str 中搜尋下一個 Token。 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