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. Дополнительные сведения: Функции 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 are wide-character и multibyte-character versions of strtokдля расширенных и многобайтовых символов. Аргументы и возвращаемое значение являются wcstok строками расширенных символов. Аргументы argumets и возвращаемое значение являются _mbstok многобайтовыми строками символов. В остальном эти три функции ведут себя идентично.

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

Важно!

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

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

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример

// 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