strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l

通过使用当前区域设置或传入的指定区域设置,查找在字符串中的下一个标记。 提供这些函数的更安全版本;请参阅 strtok_s_strtok_s_lwcstok_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 值调用 strtokNULLstrToken 参数使 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

另请参阅

字符串操作
区域设置
多字节字符序列的解释
strcspnwcscspn_mbscspn_mbscspn_l
strspnwcsspn_mbsspn_mbsspn_l