strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l

Находят следующий токен в строке с использованием текущего или переданного языкового стандарта. Доступны более безопасные версии этих функций; seestrtok_s, _strtok_s_l_mbstok_s_lwcstok_s_mbstok_s_wcstok_s_l.

Важно!

Функции _mbstok и _mbstok_l не могут использоваться в приложениях, запускаемых в среде выполнения Windows. Дополнительные сведения: Функции CRT, которые не поддерживаются в приложениях универсальной платформы Windows.

Синтаксис

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 путем замены символа NULL для первого разделителя, который возникает после возвращаемого маркера.

Замечания

Функция strtok находит следующий токен в strToken. Набор символов в параметре strDelimit указывает возможные разделители токенов, которые требуется найти в strToken во время текущего вызова. Функции wcstok и _mbstok являются версиями функции strtok для расширенных и многобайтовых символов. Аргументы и возвращаемые значения wcstok являются строками с широкими символами. Аргументы argumets и возвращаемые значения _mbstok являются строками многобайтовых символов. В остальном эти три функции ведут себя идентично.

Версия двух аргументов не является стандартной wcstok . Если вам нужно использовать эту версию, необходимо определить _CRT_NON_CONFORMING_WCSTOK перед вами #include <wchar.h> (или #include <string.h>).

Важно!

Эти функции представляют потенциальную угрозу, связанную с проблемой переполнения буфера. Проблемы переполнения буфера — это распространенный метод атак на системы, который приводит к несанкционированному повышению уровня прав. Дополнительные сведения см. в разделе "Избегание переполнения буфера".

При первом вызове функции strtok она пропускает ведущие разделители и возвращает указатель на первый токен в strToken, завершая токен нуль-символом. Из оставшейся части strToken можно выделить другие токены с помощью последовательных вызовов функции strtok. Каждый вызов strtok изменяет strToken , вставляя пустой символ после возвращаемого token этим вызовом. Чтобы прочитать следующий токен из strToken, вызовите функцию strtok со значением NULL аргумента strToken. Значение 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