strtok
, , _strtok_l
_wcstok_l
wcstok
_mbstok
,_mbstok_l
Находят следующий токен в строке с использованием текущего или переданного языкового стандарта. Доступны более безопасные версии этих функций; seestrtok_s
, _strtok_s_l
_mbstok_s_l
wcstok_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