strtok, strtok_s
|
Definiert im Header
<string.h>
|
||
| (1) | ||
|
char
*
strtok
(
char
*
str,
const
char
*
delim
)
;
|
(bis C99) | |
|
char
*
strtok
(
char
*
restrict
str,
const
char
*
restrict
delim
)
;
|
(seit C99) | |
|
char
*
strtok_s
(
char
*
restrict
str, rsize_t
*
restrict
strmax,
const char * restrict delim, char ** restrict ptr ) ; |
(2) | (seit C11) |
Tokenisiert einen nullterminierten Byte-String.
strtok
unterteilt die Zeichenkette, auf die
str
zeigt, in eine Folge von Tokens, die jeweils durch ein Zeichen aus der Zeichenkette begrenzt werden, auf die
delim
zeigt. Jeder Aufruf in der Folge hat ein
Suchziel
:
- Wenn str nicht null ist, handelt es sich um den ersten Aufruf in der Folge. Das Suchziel ist die nullterminierte Byte-Zeichenkette, auf die str zeigt.
- Wenn str null ist, handelt es sich um einen der nachfolgenden Aufrufe in der Folge. Das Suchziel wird durch den vorherigen Aufruf in der Folge bestimmt.
- Wenn kein solches Zeichen gefunden wird, gibt es keine Tokens im Suchziel. Das Suchziel für den nächsten Aufruf in der Sequenz bleibt unverändert. [1]
-
Wenn ein solches Zeichen gefunden wird, ist es der Start des aktuellen Tokens.
strtokdurchsucht dann ab dort nach dem ersten Zeichen, das in der Trennzeichenfolge 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 Sequenz ist eine leere Zeichenfolge. [2]
- Wenn ein solches Zeichen gefunden wird, wird es durch ein Nullzeichen überschrieben, wodurch das aktuelle Token beendet wird. Das Suchziel für den nächsten Aufruf in der Sequenz beginnt ab dem folgenden Zeichen.
- Bei jedem Aufruf wird die Anzahl der noch zu lesenden Zeichen in str in * strmax geschrieben und der interne Zustand des Tokenizers in * ptr gespeichert.
- Nachfolgende Aufrufe in der Sequenz müssen strmax und ptr mit den durch den vorherigen Aufruf gespeicherten Werten übergeben.
-
Die folgenden Fehler werden zur Laufzeit erkannt und rufen den aktuell installierten
constraint handler
auf, ohne etwas in das durch
ptr
gezeigte Objekt zu schreiben:
- strmax , delim oder ptr ist ein null pointer.
- * ptr ist ein null pointer für einen nachfolgenden Aufruf in der Sequenz.
- * strmax ist größer als RSIZE_MAX .
- Das Ende des gefundenen Tokens liegt nicht innerhalb der ersten * s1max Zeichen des Suchziels.
strtok_s
ist nur garantiert verfügbar, wenn
__STDC_LIB_EXT1__
durch die Implementierung definiert ist und wenn der Benutzer
__STDC_WANT_LIB_EXT1__
auf den Integer-Konstantenwert
1
setzt, bevor
<string.h>
eingebunden wird.
- ↑ Ein Token kann in einem nachfolgenden Aufruf mit einer anderen Trennzeichenkette weiterhin gebildet werden.
- ↑ In nachfolgenden Aufrufen können keine weiteren Tokens mehr gebildet werden.
Inhaltsverzeichnis |
Parameter
| str | - | Zeiger auf die nullterminierte Byte-Zeichenkette zur Tokenisierung |
| delim | - | Zeiger auf die nullterminierte Byte-Zeichenkette mit Trennzeichen |
| strmax | - |
Zeiger auf ein Objekt, das anfänglich die Größe von
str
enthält:
strtok_s
speichert die Anzahl der noch zu untersuchenden Zeichen
|
| ptr | - |
Zeiger auf ein Objekt vom Typ
char
*
, das von
strtok_s
zur Speicherung seines internen Zustands verwendet wird
|
Rückgabewert
Hinweis
Diese Funktion ist destruktiv: sie schreibt die
'
\0
'
Zeichen in die Elemente des Strings
str
. Insbesondere kann ein String-Literal nicht als erstes Argument von
strtok
verwendet werden.
Jeder Aufruf von
strtok
modifiziert eine statische Variable: ist nicht threadsicher.
Im Gegensatz zu den meisten anderen Tokenizern können die Trennzeichen in
strtok
für jeden nachfolgenden Token unterschiedlich sein und können sogar von den Inhalten der vorherigen Token abhängen.
Die
strtok_s
-Funktion unterscheidet sich von der POSIX-
strtok_r
-Funktion dadurch, dass sie vor dem Speichern außerhalb des zu tokenisierenden Strings schützt und Laufzeitbeschränkungen überprüft. Die Microsoft CRT-
strtok_s
-Signatur entspricht dieser POSIX-
strtok_r
-Definition, nicht der C11-
strtok_s
-Definition.
Beispiel
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdio.h> #include <string.h> int main(void) { char input[] = "A bird came down the walk"; printf("Parsing the input string '%s'\n", input); char* token = strtok(input, " "); while (token) { puts(token); token = strtok(NULL, " "); } printf("Contents of the input string now: '"); for (size_t n = 0; n < sizeof input; ++n) input[n] ? putchar(input[n]) : fputs("\\0", stdout); puts("'"); #ifdef __STDC_LIB_EXT1__ char str[] = "A bird came down the walk"; rsize_t strmax = sizeof str; const char* delim = " "; char* next_token; printf("Parsing the input string '%s'\n", str); token = strtok_s(str, &strmax, delim, &next_token); while (token) { puts(token); token = strtok_s(NULL, &strmax, delim, &next_token); } printf("Contents of the input string now: '"); for (size_t n = 0; n < sizeof str; ++n) str[n] ? putchar(str[n]) : fputs("\\0", stdout); puts("'"); #endif }
Mögliche Ausgabe:
Parsing the input string 'A bird came down the walk' A bird came down the walk Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0' Parsing the input string 'A bird came down the walk' A bird came down the walk Contents of the input string now: 'A\0bird\0came\0down\0the\0walk\0'
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 7.24.5.8 Die strtok-Funktion (S.: TBD)
-
- K.3.7.3.1 Die strtok_s-Funktion (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 7.24.5.8 Die strtok-Funktion (S.: TBD)
-
- K.3.7.3.1 Die strtok_s-Funktion (S.: TBD)
- C11 Standard (ISO/IEC 9899:2011):
-
- 7.24.5.8 Die strtok-Funktion (S: 369-370)
-
- K.3.7.3.1 Die strtok_s-Funktion (S: 620-621)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.21.5.8 Die strtok-Funktion (S: 332-333)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 4.11.5.8 Die strtok-Funktion
Siehe auch
|
findet die erste Position eines beliebigen Zeichens aus einer Zeichenkette in einer anderen Zeichenkette
(Funktion) |
|
|
gibt die Länge des maximalen Anfangssegments zurück, das nur aus
Zeichen besteht, die nicht in einer anderen Byte-Zeichenkette gefunden werden (Funktion) |
|
|
gibt die Länge des maximalen Anfangssegments zurück, das nur aus
Zeichen besteht, die in einer anderen Byte-Zeichenkette gefunden werden (Funktion) |
|
|
(C95)
(C11)
|
findet das nächste Token in einer Breitzeichen-Zeichenkette
(Funktion) |
|
C++-Dokumentation
für
strtok
|
|