Поделиться через


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, которые не поддерживаются с ключом /ZW.

char *strtok(
   char *strToken,
   const char *strDelimit 
);
wchar_t *wcstok(
   wchar_t *strToken,
   const wchar_t *strDelimit 
);
unsigned char *_mbstok(
   unsigned char*strToken,
   const unsigned char *strDelimit 
);
unsigned char *_mbstok(
   unsigned char*strToken,
   const unsigned char *strDelimit,
   _locale_t locale
);

Параметры

  • strToken
    Строка, содержащая токен или токены.

  • strDelimit
    Набор разделителей.

  • locale
    Языковой стандарт, который необходимо использовать.

Возвращаемое значение

Возвращает указатель на следующий токен, найденный в strToken. Они возвращают NULL, если ни одного токена больше не удается найти. Каждый вызов изменяет strToken, заменяя символом NULL на первый разделитель, находящийся после возвращенного токена.

Заметки

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

Примечание о безопасностиПримечание по безопасности

Эти функции создают потенциальную угрозу, принесенную вместе с проблемой переполнения буфера.Ошибки переполнения буфера — частый метод атаки системы, в результате которого происходит несанкционированное получение прав.Дополнительные сведения см. в разделе Как избежать переполнения буфера.

При первом вызове strtok функция пропускает ведущие разделители и возвращает указатель на первый токен в strToken, ставя в конец токена нуль-символ. Из оставшейся части strToken можно выделить больше токенов с помощью серии вызовов strtok. Каждый вызов strtok изменяет strToken, вставляя нуль-символ после token, возвращаемого этим вызовом. Чтобы считать следующий токен из strToken, вызовите strtok со значением NULL для аргумента strToken. Аргумент strToken со значением NULL приводит к тому, что strtok ищет следующий токен в измененной strToken. Аргумент strDelimit может принимать любое значение от одного вызова к другому, чтобы набор разделителей мог меняться.

Выходное значение зависит от настройки категории LC_CTYPE языкового стандарта; дополнительные сведения см. в разделе setlocale. Версии этих функций без суффикса _l используют текущий языковой стандарт для данной функциональности, зависящей от языкового стандарта; версии с суффиксом _l идентичны, за исключением того, что они используют переданный параметр языкового стандарта. Для получения дополнительной информации см. Языковой стандарт.

Примечание

Каждая функция использует локальную для потока статическую переменную для разбора строки на токены.Следовательно, несколько потоков могут одновременно вызывать эти функции без нежелательных эффектов.Однако внутри одного потока чередующиеся вызовы одной из этих функций с высокой вероятностью могут привести к повреждению данных и неточным результатам.Во время разбора разных строк, завершите разбор одной строки до того, как начинать разбор другой.Кроме того, помните о возможных рисках, когда вызываете одну из этих функций из тела цикла, в котором вызывается другая функция.Если другая функция заканчивается использованием одной из этих функций, чередующаяся последовательность вызовов приведет к повреждению данных.

Универсальное текстовое сопоставление функций

Подпрограмма 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>

_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
   }
}
  

Эквивалент в .NET Framework

Неприменимо. Для вызова стандартной функции C используйте PInvoke. Дополнительные сведения см. в разделе Примеры вызовов неуправляемого кода.

См. также

Ссылки

Управление строками (CRT)

Языковой стандарт

Интерпретация последовательностей в многобайтной кодировке

strcspn, wcscspn, _mbscspn, _mbscspn_l

strspn, wcsspn, _mbsspn, _mbsspn_l