Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/string/byte/strtok"

From cppreference.com
< cpp‎ | string‎ | byte
m (Example: introduced a delimiter-set and more useful input data set)
m (Example: added the content of the `input` after tokenization, by analogy with c/string/byte/strtok)
Line 53: Line 53:
 
         token = std::strtok(nullptr, delimiters);
 
         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 (auto c = input[n]; c)
 +
            std::cout << c;
 +
        else
 +
            std::cout << "\\0";
 +
    std::cout << "\"\n";
 
}
 
}
  | output="one" "two" "tree" "four"
+
  | output=
 +
"one" "two" "three" "four"
 +
Contents of the input string now:
 +
"one\0+ two\0* (three\0- four\0!\0"
 
}}
 
}}
  

Revision as of 05:38, 18 July 2021

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 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.

  • If str is not a null pointer, the call is treated as the first call to strtok for this particular string. The function searches for the first character which is not contained in delim.
  • If no such character was found, there are no tokens in str at 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, str has only one token, and the future calls to strtok will 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 str is a null pointer, the call is treated as a subsequent call to strtok: the function continues from where it left in previous invocation. The behavior is the same as if the previously stored pointer is passed as str.

Contents

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 null pointer if there are no more tokens.

Notes

This function is destructive: it writes the '\0' characters in the elements of the string str. In particular, a string literal cannot be used as the first argument of strtok.

Each call to this function modifies a static variable: is not thread safe.

Unlike most other tokenizers, the delimiters in strtok can be different for each subsequent token, and can even depend on the contents of the previous tokens.

Example

#include <cstring>
#include <iostream>
#include <iomanip>
 
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 (auto c = input[n]; c)
            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

finds the first location of any character from a set of separators
(function) [edit]
returns the length of the maximum initial segment that consists
of only the characters not found in another byte string
(function) [edit]
returns the length of the maximum initial segment that consists
of only the characters found in another byte string
(function) [edit]
a view over the subranges obtained from splitting another view using a delimiter
(class template) (range adaptor object)[edit]
C documentation for strtok