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