strtok_s、_strtok_s_l、wcstok_s、_wcstok_s_l、_mbstok_s、_mbstok_s_l
通过使用当前区域设置或通过的区域设置,查找在字符串中的下一个标记。 strtok、_strtok_l、wcstok、_wcstok_l、_mbstok、_mbstok_l 的这些版本如 CRT 中的安全功能 所述,其安全得到了增强。
重要
_mbstok_s 和 _mbstok_s_l 不能在 Windows 运行,执行的应用程序中使用。有关详细信息,请参见 CRT functions not supported with /ZW(CRT 函数不支持使用/ZW)。
char *strtok_s(
char *strToken,
const char *strDelimit,
char **context
);
char *_strtok_s_l(
char *strToken,
const char *strDelimit,
char **context,
_locale_tlocale
);
wchar_t *wcstok_s(
wchar_t *strToken,
const wchar_t *strDelimit,
wchar_t**context
);
wchar_t *_wcstok_s_l(
wchar_t *strToken,
const wchar_t *strDelimit,
wchar_t**context,
_locale_tlocale
);
unsigned char *_mbstok_s(
unsigned char*strToken,
const unsigned char *strDelimit,
char **context
);
unsigned char *_mbstok_s(
unsigned char*strToken,
const unsigned char *strDelimit,
char **context,
_locale_tlocale
);
参数
strToken
字符串包含一个标记或一个以上的标记。strDelimit
分隔符的设置。context
用于存储调用 strtok_s 之间位置信息locale
要使用的区域设置。
返回值
返回指向在 strToken中的下一个标记的指针。 当未找到其他标记时,它们返回 NULL 。 每个调用都通过用在返回的标记后面的第一个分隔符替换 NULL 字符,修改 strToken 。
错误情况
strToken |
strDelimit |
context |
返回值 |
errno |
---|---|---|---|---|
NULL |
any |
指向一个空指针 |
NULL |
EINVAL |
any |
NULL |
any |
NULL |
EINVAL |
any |
any |
NULL |
NULL |
EINVAL |
如果 strToken 为 NULL,但上下文是一个指针指向有效的上下文指针,则不会产生错误。
备注
strtok_s 函数来查找在 strToken的下一个标记。 将 strDelimit 字符的设置指定标记分隔符可能在当前调用的 strToken 找到的。 wcstok_s 和 _mbstok_s是宽字符,strtok_s是多节字字符版本。 wcstok_s 和 _wcstok_s_l参数和返回值都是宽字符字符串;_mbstok_s 和 _mbstok_s_l的参数和返回值为多字节字符字符串。 否则这三个函数否则具有相同行为。
此函数验证其参数。 如果出现一个错误状态,则当处于错误状态表中,将调用无效参数调用处理程序,如 参数验证所述。 如果允许继续执行,则这些函数将 errno 设置为 EINVAL,并返回NULL。
一般文本例程映射
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 函数跳过前导分隔符并返回指向在 strToken的第一个标记的指针,以空字符终止标记。 通过一系列 strtok_s 的调用,多个标记将被从 strToken 的其余部分拆开。 每个调用 strtok_s 通过插入 null 字符修改 strToken 在该返回的标记之后调用。 context 指针记录哪个字符串被读取,并记录将字符串下一个标记要读取的位置。 若要读取 strToken的下一个标记,请调用带有一个 strToken 参数的NULL 值的 strtok_s ,并传递相同的 context 参数。 NULL strToken 参数引起 strtok_s 搜索修改的 strToken的下一个标记。 strDelimit 参数可以接收一个调用到另一调用的任何值对,以便分隔符的设置可以更改。
因为 context 参数可用于 strtok 和 _strtok_l的静态缓冲区区域,同时在同一线程上分析两个字符串是可能的。
输出值受区域设置的 LC_CTYPE 类设置影响;有关更多信息,请参见 setlocale。 这些不带 _l 后缀的函数的版本使用为该区域设置相关的行为的当前区域设置;带有 _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);
}
}
}
.NET Framework 等效项
不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见平台调用示例。