Spec-Zone.ru › C++

std::strtok

Определено в заголовке <cstring>
char* strtok( char* str, const char* delim );

Находит следующий токен в строке байт с нулевым завершением, на которую указывает str. Разделительные символы определяются строкой байт с нулевым завершением, на которую указывает delim.

Эта функция предназначена для вызова несколько раз для получения последовательных токенов из одной строки.

  • Если str не является указателем на null, вызов обрабатывается как первый вызов strtok для этой конкретной строки. Функция ищет первый символ, который не содержится в delim.
  • Если такой символ не найден, токенов в str вообще нет, и функция возвращает указатель на null.
  • Если такой символ найден, он является началом токена. Затем функция ищет с этой точки первый символ, который содержится в delim.
    • Если такой символ не найден, у str есть только один токен, и последующие вызовы strtok будут возвращать указатель на null.
    • Если такой символ найден, он заменяется нулевым символом '\0', и указатель на следующий символ сохраняется в статической области памяти для последующих вызовов.
  • Затем функция возвращает указатель на начало токена.
  • Если str является указателем на null, вызов обрабатывается как последующий вызов strtok: функция продолжает с того места, где она остановилась в предыдущем вызове. Поведение такое же, как если бы ранее сохраненный указатель был передан как str.

Параметры

str - указатель на строку байт с нулевым завершением для токенизации
delim - указатель на строку байт с нулевым завершением, определяющую разделители

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

Указатель на начало следующего токена или nullptr, если больше нет токенов.

Примечания

Эта функция является деструктивной: она записывает символы '\0' в элементы строки str. В частности, строковая константа не может использоваться в качестве первого аргумента std::strtok.

Каждый вызов этой функции изменяет статическую переменную: не является потокобезопасным.

В отличие от большинства других токенизаторов, разделители в std::strtok могут быть разными для каждого последующего токена и даже зависеть от содержимого предыдущих токенов.

Возможная реализация

char* strtok(char* str, const char* delim)
{
    static char* buffer;
 
    if (str != nullptr)
        buffer = str;
 
    buffer += std::strspn(buffer, delim);
 
    if (*buffer == '\0')
        return nullptr;
 
    char* const tokenBegin = buffer;
 
    buffer += std::strcspn(buffer, delim);
 
    if (*buffer != '\0')
        *buffer++ = '\0';
 
    return tokenBegin;
}

Фактические реализации этой функции в C++ библиотеках делегируют вызов C-библиотеке, где она может быть реализована непосредственно (как в MUSL libc), или в терминах своей реентерабельной версии (как в GNU libc).

Пример

#include <cstring>
#include <iomanip>
#include <iostream>
 
int main() 
{
    char input[] = "one + two * (three - four)!";
    const char* delimiters = "! +- (*)";
    char* token = std::strtok(input, delimiters);
    while (token)
    {
        std::cout << std::quoted(token) << ' ';
        token = std::strtok(nullptr, delimiters);
    }
 
    std::cout << "\nContents of the input string now:\n\"";
    for (std::size_t n = 0; n < sizeof input; ++n)
    {
        if (const char c = input[n]; c != '\0')
            std::cout << c;
        else
            std::cout << "\\0";
    }
    std::cout << "\"\n";
}

Вывод:

"one" "two" "three" "four" 
Contents of the input string now:
"one\0+ two\0* (three\0- four\0!\0"

См. также

strpbrk
находит первое вхождение любого символа из набора разделителей
(функция)
strcspn
возвращает длину максимального начального сегмента, состоящего
только из символов, не встречающихся в другой строке байтов
(функция)
strspn
возвращает длину максимального начального сегмента, состоящего
только из символов, встречающихся в другой строке байтов
(функция)
ranges::split_viewviews::split
(C++20)
view над поддиапазонами, полученными из разделения другого view с помощью разделителя
(шаблон класса) (адаптер диапазонов)
Документация C по strtok

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/byte/strtok

Spec-Zone.ru

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