strtok
、、_strtok_l
wcstok
、_wcstok_l
、_mbstok
、_mbstok_l
通过使用当前区域设置或传入的指定区域设置,查找在字符串中的下一个标记。 提供这些函数的更安全版本;请参阅 strtok_s
、_strtok_s_l
、wcstok_s
、_wcstok_s_l
、_mbstok_s
、_mbstok_s_l
。
重要
_mbstok
和 _mbstok_l
无法用于在 Windows 运行时中执行的应用程序。 有关详细信息,请参阅通用 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
包含一个或多个标记的字符串。
strDelimit
分隔符字符组。
locale
要使用的区域设置。
context
指向用于存储解析器内部状态的内存,以便下次调用 wcstok
时解析器可以从中断处继续。
返回值
返回 strToken
中找到的指向下一个标记的指针。 函数在未找到更多标记时返回 NULL
。 每次调用都会修改 strToken
,方法是通过在标记返回后,为出现的第一个分隔符替换空字符。
备注
strtok
函数查找 strToken
中的下一个标记。 strDelimit
中的字符组指定在当前调用上的 strToken
中找到的可能的标记分隔符。 wcstok
和 _mbstok
分别是 strtok
的宽字符及多字节字符版本。 wcstok
的参数和返回值为宽字符字符串。 _mbstok
的参数和返回值为多字节字符字符串。 否则这三个函数否则具有相同行为。
wcstok
的两个参数版本不是标准的。 如果需要使用该版本,则需要在 #include <wchar.h>
(或 #include <string.h>
)之前定义 _CRT_NON_CONFORMING_WCSTOK
。
重要
这些函数会引发由缓冲区溢出问题带来的潜在威胁。 缓冲区溢出问题是常见的系统攻击方法,使权限的提升不能确保。 有关详细信息,请参阅避免缓冲区溢出。
首次调用 strtok
时,函数跳过前导分隔符并返回指向 strToken
中的第一个标记的指针,终止空字符的标记。 通过对 strtok
的一系列调用,可以从 strToken
的其余部分中分离出更多标记。 每次调用 strtok
都会修改 strToken
,方法是在通过调用返回 token
后插入空字符。 若要读取来自 strToken
的下一个标记,请使用 strToken
参数的 NULL
值调用 strtok
。 该NULL
strToken
参数导致strtok
搜索修改strToken
后的下一个标记。 strDelimit
实参可以采用从第一个调用到下一个调用的任何值,以使分隔符集有所不同。
输出值受区域设置的 LC_CTYPE
类别设置的影响。 有关详细信息,请参阅 setlocale
。
不带 _l
后缀的这些函数的版本会将当前区域设置用于此区域设置的相关行为。 带 _l
后缀的版本是相同的,只不过它们转而使用传入的区域设置参数。 有关详细信息,请参阅 Locale。
注意
每个函数均使用线程本地静态变量,以将字符串分析为标记。 因此,多线程可以同时调用这些函数,不会产生不良影响。 但是,在单个线程内,对任一这些函数的交替调用很可能导致数据损坏和结果不准确。 解析不同的字符串时,在解析完一个字符串后再开始解析下一个字符串。 此外,请注意,从调用其他函数的循环内调用其中任一函数可能引发潜在危险。 如果其他函数最终使用这些函数之一,则导致调用交错的序列,从而触发数据损坏。
默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 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