std::strtok(3)
std::strtok(3)
okay bestie, this is std::strtok(3) from the C++ Standard Libary man page β manual name folded in right here like a little name tag π. She tokenizes strings, she has static state, and she is ready to spill. Let's get into it.
π NAME π
std::strtok - std::strtok (yes bestie, that's literally the name, she's not doing too much).
β¨ Synopsis β¨
Defined in header <cstring>.
char* strtok( char* str, const char* delim );
Finds the next token in a null-terminated byte string pointed to by str. The separator characters are identified by the null-terminated byte string pointed to by delim.
This function is designed to be called multiple times to obtain successive tokens from the same string.
okay so here's the exact play-by-play, no cap:
- If
stris not a null pointer, the call is treated as the first call tostrtokfor this particular string. The function searches for the first character which is not contained indelim. - If no such character was found, there are no tokens in
strat all, and the function returns a null pointer. - If such character was found, it is the beginning of the token. The function then searches from that point on for the first character that is contained in
delim. - If no such character was found,
strhas only one token, and the future calls tostrtokwill return a null pointer. - If such character was found, it is replaced by the null character
'\0'and the pointer to the following character is stored in a static location for subsequent invocations. - The function then returns the pointer to the beginning of the token.
- If
stris a null pointer, the call is treated as a subsequent call tostrtok: the function continues from where it left in previous invocation. The behavior is the same as if the previously stored pointer is passed asstr.
πΈ Parameters πΈ
strβ pointer to the null-terminated byte string to tokenize.delimβ pointer to the null-terminated byte string identifying delimiters.
π Return value π
Pointer to the beginning of the next token or a nullptr if there are no more tokens.
β οΈ Notes β οΈ
bestie, this function is destructive: it writes the'\0'characters in the elements of the stringstr. In particular, a string literal cannot be used as the first argument ofstd::strtok. do not pass a literal, I am begging π
Each call to this function modifies a static variable: is not thread safe. fr fr.
Unlike most other tokenizers, the delimiters in std::strtok can be different for each subsequent token, and can even depend on the contents of the previous tokens. she's flexible like that π
.
π§ Possible implementation π§
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;
}
Actual C++ library implementations of this function delegate to the C library, where it may be implemented directly (as in MUSL libc), or in terms of its reentrant version (as in GNU libc).
π Example π
// Run this code
#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";
}
π Output: π
"one" "two" "three" "four"
Contents of the input string now:
"one\0+ two\0* (three\0- four\0!\0"
π See also π
strpbrkβ finds the first location of any character from a set of separators (function).strcspnβ returns the length of the maximum initial segment that consists of only the characters not found in another byte string (function).strspnβ returns the length of the maximum initial segment that consists of only the characters found in another byte string (function).ranges::split_viewβ a view over the subranges obtained from splitting another view using a delimiter;(C++20); (class template).views::splitβ a view over the subranges obtained from splitting another view using a delimiter;(C++20); (range adaptor object).- C documentation for
strtok.
okay that's the whole page, bestie! source: http://cppreference.com, version/date: 2024.06.10, and it's std::strtok(3) β mwah πβ¨
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms