Spec-Zone.ru › C

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)
1) Находит следующий токен в строке с нулевым завершением, указанной по адресу str. Разделители определяются строкой с нулевым завершением по адресу delim.
Эта функция предназначена для многократного вызова, чтобы получить последовательные токены из одной и той же строки.
  • Если str не является указателем на NULL, вызов обрабатывается как первый вызов strtok для данной строки. Функция ищет первый символ, который не содержится в delim.
  • Если такой символ не был найден, то в str вообще нет токенов, и функция возвращает нулевой указатель.
  • Если такой символ был найден, он является началом токена. Затем функция ищет от этой точки первый символ, который содержится в delim.
    • Если такой символ не был найден, str содержит только один токен, и последующие вызовы strtok будут возвращать нулевой указатель.
    • Если такой символ был найден, он заменяется нулевым символом '\0', и указатель на следующий символ сохраняется в статическом месте для последующих вызовов.
  • Затем функция возвращает указатель на начало токена.
  • Если str является нулевым указателем, вызов обрабатывается как последующий вызов strtok: функция продолжает с того места, где остановилась в предыдущем вызове. Поведение такое же, как если бы ранее сохраненный указатель был передан как str.
Поведение неопределено, если либо str, либо delim не являются указателями на строку с нулевым завершением.
2) То же, что и (1), за исключением того, что на каждой итерации записывает количество оставшихся символов для просмотра в 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

См. также

strpbrk
находит первое вхождение любого символа из одной строки в другой
(функция)
strcspn
возвращает длину максимального начального сегмента, состоящего
только из символов, отсутствующих в другой строке байтов
(функция)
strspn
возвращает длину максимального начального сегмента, состоящего
только из символов, присутствующих в другой строке байтов
(функция)
wcstokwcstok_s
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API