strtok, strtok_s
Defined in header <string.h> |
||
|---|---|---|
| (1) | ||
char *strtok( char *str, const char *delim ); |
(до C99) | |
char *strtok( char *restrict str, const char *restrict delim ); |
(с C99) | |
char *strtok_s(char *restrict str, rsize_t *restrict strmax,
const char *restrict delim, char **restrict ptr);
|
(2) | (с C11) |
str. Разделители определяются строкой с нулевым завершением по адресу delim.
- Если
strне является указателем на NULL, вызов обрабатывается как первый вызовstrtokдля данной строки. Функция ищет первый символ, который не содержится вdelim. - Если такой символ не был найден, то в
strвообще нет токенов, и функция возвращает нулевой указатель. - Если такой символ был найден, он является началом токена. Затем функция ищет от этой точки первый символ, который содержится в
delim. - Если такой символ не был найден,
strсодержит только один токен, и последующие вызовыstrtokбудут возвращать нулевой указатель. - Если такой символ был найден, он заменяется нулевым символом
'\0', и указатель на следующий символ сохраняется в статическом месте для последующих вызовов. - Затем функция возвращает указатель на начало токена.
- Если
strявляется нулевым указателем, вызов обрабатывается как последующий вызовstrtok: функция продолжает с того места, где остановилась в предыдущем вызове. Поведение такое же, как если бы ранее сохраненный указатель был передан какstr.
str, либо delim не являются указателями на строку с нулевым завершением.
str в *strmax и записывает внутреннее состояние токенизатора в *ptr. Повторные вызовы (с нулевым str) должны передавать strmax и ptr со значениями, сохраненными предыдущим вызовом. Кроме того, следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработчика ограничений обработчика ограничений, ничего не сохраняя в объекте, на который указывает ptr:
-
strmax,delim, илиptrявляется нулевым указателем - при неначальном вызове (с нулевым
str)*ptrявляется нулевым указателем - при первом вызове
*strmaxравно нулю или большеRSIZE_MAX - поиск конца токена достигает конца исходной строки (как измеряется начальным значением
*strmax) без обнаружения нулевого терминатора
str указывает на массив символов, в котором отсутствует нулевой символ, и strmax указывает на значение, большее размера этого массива символов. Как и во всех функциях с проверкой границ, strtok_s гарантируется доступным только в том случае, если __STDC_LIB_EXT1__ определено реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целую константу 1 перед включением <string.h>.
Параметры
| str | - | указатель на строку с нулевым завершением, подлежащую токенизации |
| delim | - | указатель на строку с нулевым завершением, определяющую разделители |
| strmax | - | указатель на объект, который изначально содержит размер str: strtok_s хранит количество символов, которые остаются для проверки |
| ptr | - | указатель на объект типа char*, используемый strtok_s для хранения своего внутреннего состояния |
Возвращаемое значение
Возвращает указатель на начало следующего токена или нулевой указатель, если больше нет токенов.
Примечание
Эта функция является деструктивной: она записывает '\0' символов в элементы строки str. В частности, строковая константа не может использоваться в качестве первого аргумента strtok.
Каждый вызов strtok изменяет статическую переменную: не является потокобезопасной.
В отличие от большинства других токенизаторов, разделители в strtok могут отличаться для каждого последующего токена и даже могут зависеть от содержимого предыдущих токенов.
Функция strtok_s отличается от функции POSIX strtok_r тем, что она защищает от хранения за пределами токенизируемой строки и проверяет ограничения во время выполнения. Подпись Microsoft CRT strtok_s соответствует этому определению POSIX strtok_r, а не C11 strtok_s.
Пример
#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
#include <stdio.h>
int main(void)
{
char input[] = "A bird came down the walk";
printf("Parsing the input string '%s'\n", input);
char *token = strtok(input, " ");
while(token) {
puts(token);
token = strtok(NULL, " ");
}
printf("Contents of the input string now: '");
for(size_t n = 0; n < sizeof input; ++n)
input[n] ? putchar(input[n]) : fputs("\\0", stdout);
puts("'");
#ifdef __STDC_LIB_EXT1__
char str[] = "A bird came down the walk";
rsize_t strmax = sizeof str;
const char *delim = " ";
char *next_token;
printf("Parsing the input string '%s'\n", str);
token = strtok_s(str, &strmax, delim, &next_token);
while(token) {
puts(token);
token = strtok_s(NULL, &strmax, delim, &next_token);
}
printf("Contents of the input string now: '");
for(size_t n = 0; n < sizeof str; ++n)
str[n] ? putchar(str[n]) : fputs("\\0", stdout);
puts("'");
#endif
}Возможный вывод:
Parsing the input string 'A bird came down the walk' A bird came down the walk Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0' Parsing the input string 'A bird came down the walk' A bird came down the walk Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0'
Ссылки
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.24.5.8 Функция strtok (с. 369-370)
- K.3.7.3.1 Функция strtok_s (с. 620-621)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.21.5.8 Функция strtok (с. 332-333)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.11.5.8 Функция strtok
См. также
| находит первое вхождение любого символа из одной строки в другой (функция) |
|
| возвращает длину максимального начального сегмента, состоящего только из символов, отсутствующих в другой строке байтов (функция) |
|
| возвращает длину максимального начального сегмента, состоящего только из символов, присутствующих в другой строке байтов (функция) |
|
|
(C95)(C11) |
находит следующий токен в строке широких символов (функция) |
Документация C++ для strtok |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/byte/strtok