std::strtok
| Definiert in Header <cstring> |
||
| char* strtok( char* str, const char* delim ); |
||
Tokenisiert eine nullterminierte Byte-Zeichenkette.
Eine Folge von Aufrufen von std::strtok zerlegt die von str zeigende Zeichenkette in eine Folge von Tokens, die jeweils durch ein Zeichen aus der von delim zeigenden Zeichenkette abgegrenzt werden. Jeder Aufruf in der Folge hat ein Suchziel
- Wenn str nicht null ist, ist der Aufruf der erste Aufruf in der Folge. Das Suchziel ist die nullterminierte Byte-Zeichenkette, auf die str zeigt.
- Wenn str null ist, ist der Aufruf einer der nachfolgenden Aufrufe in der Folge. Das Suchziel wird durch den vorherigen Aufruf in der Folge bestimmt.
Jeder Aufruf in der Folge durchsucht das Suchziel nach dem ersten Zeichen, das nicht in der Trennzeichenkette enthalten ist, auf die delim zeigt. Die Trennzeichenkette kann von Aufruf zu Aufruf unterschiedlich sein.
- Wenn kein solches Zeichen gefunden wird, gibt es keine Tokens im Suchziel. Das Suchziel für den nächsten Aufruf in der Folge bleibt unverändert.[1]
- Wenn ein solches Zeichen gefunden wird, ist es der Anfang des aktuellen Tokens.
std::strtoksucht dann von dort nach dem ersten Zeichen, das in der Trennzeichenkette enthalten ist.- Wenn kein solches Zeichen gefunden wird, erstreckt sich das aktuelle Token bis zum Ende des Suchziels. Das Suchziel für den nächsten Aufruf in der Folge ist eine leere Zeichenkette.[2]
- Wenn ein solches Zeichen gefunden wird, wird es durch ein Nullzeichen überschrieben, das das aktuelle Token abschließt. Das Suchziel für den nächsten Aufruf in der Folge beginnt beim folgenden Zeichen.
Wenn str oder delim kein Zeiger auf eine nullterminierte Byte-Zeichenkette ist, ist das Verhalten undefiniert.
- ↑ Ein Token kann immer noch in einem nachfolgenden Aufruf mit einer anderen Trennzeichenkette gebildet werden.
- ↑ In nachfolgenden Aufrufen können keine weiteren Tokens mehr gebildet werden.
Inhalt |
[bearbeiten] Parameter
| str | - | Zeiger auf die nullterminierte Byte-Zeichenkette, die tokenisiert werden soll |
| delim | - | Zeiger auf die nullterminierte Byte-Zeichenkette, die Trennzeichen identifiziert |
[bearbeiten] Rückgabewert
Gibt einen Zeiger auf das erste Zeichen des nächsten Tokens zurück, oder einen Nullzeiger, wenn kein Token vorhanden ist.
[bearbeiten] Hinweise
Diese Funktion ist destruktiv: Sie schreibt die '\0'-Zeichen in die Elemente der Zeichenkette str. Insbesondere kann eine String-Literal nicht als erstes Argument von std::strtok verwendet werden.
Jeder Aufruf dieser Funktion modifiziert eine statische Variable: Sie ist nicht threadsicher.
Im Gegensatz zu den meisten anderen Tokenizern können die Trennzeichen in std::strtok für jedes nachfolgende Token unterschiedlich sein und sogar vom Inhalt der vorherigen Tokens abhängen.
[bearbeiten] Mögliche Implementierung
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; } |
Tatsächliche C++-Bibliotheksimplementierungen dieser Funktion delegieren an die C-Bibliothek, wo sie entweder direkt implementiert wird (wie in MUSL libc) oder in Bezug auf ihre reentrant-Version (wie in GNU libc).
[bearbeiten] Beispiel
#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"; }
Ausgabe
"one" "two" "three" "four" Contents of the input string now: "one\0+ two\0* (three\0- four\0!\0"
[bearbeiten] Siehe auch
| findet die erste Stelle eines beliebigen Zeichens aus einer Menge von Trennzeichen (Funktion) | |
| gibt die Länge des maximalen Anfangssegments zurück, das nur aus den Zeichen besteht, die in einem anderen Byte-String nicht vorkommen (Funktion) | |
| gibt die Länge des maximalen Anfangssegments zurück, das nur aus den Zeichen besteht, die in einem anderen Byte-String vorkommen (Funktion) | |
ein view über die Unterbereiche, die durch Aufteilen eines anderen view mit einem Trennzeichen gebildet werden(Klassen-Template) (Range-Adaptor-Objekt) | |
| C-Dokumentation für strtok
| |