Namespaces
Variants

strtok, strtok_s

From cppreference.net
< c ‎ | string ‎ | byte
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.

1) Eine Folge von Aufrufen von 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.
Jeder Aufruf in der Sequenz durchsucht das Suchziel nach dem ersten Zeichen, das nicht in der Trennzeichenfolge enthalten ist, auf die delim zeigt. Die Trennzeichenfolge 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 Sequenz bleibt unverändert. [1]
  • Wenn ein solches Zeichen gefunden wird, ist es der Start des aktuellen Tokens. strtok durchsucht 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.
Wenn str oder delim kein Zeiger auf eine nullterminierte Byte-Zeichenkette ist, ist das Verhalten undefiniert.
2) Gleich wie (1) , mit folgenden Unterschieden:
  • 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.
Wenn sowohl str auf ein Zeichenarray zeigt, dem das Nullzeichen fehlt, als auch strmax auf einen Wert zeigt, der größer ist als die Größe dieses Zeichenarrays, ist das Verhalten undefiniert.
Wie bei allen grenzprüfenden Funktionen, 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.
  1. Ein Token kann in einem nachfolgenden Aufruf mit einer anderen Trennzeichenkette weiterhin gebildet werden.
  2. 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

1) Gibt einen Zeiger auf das erste Zeichen des nächsten Tokens zurück oder einen Nullzeiger, falls kein Token vorhanden ist.
2) Gibt einen Zeiger auf das erste Zeichen des nächsten Tokens zurück, oder einen Nullzeiger, falls kein Token vorhanden ist oder eine Runtime-Constraint-Verletzung auftritt.

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)