Namespaces
Variants

wcstok, wcstok_s

From cppreference.net
< c ‎ | string ‎ | wide
Definiert in Header <wchar.h>
(1)
wchar_t * wcstok ( wchar_t * str, const wchar_t * delim, wchar_t ** ptr ) ;
(seit C95)
(bis C99)
wchar_t * wcstok ( wchar_t * restrict str, const wchar_t * restrict delim,
wchar_t ** restrict ptr ) ;
(seit C99)
wchar_t * wcstok_s ( wchar_t * restrict str, rsize_t * restrict strmax,
const wchar_t * restrict delim, wchar_t ** restrict ptr ) ;
(2) (seit C11)
1) Findet das nächste Token in einer nullterminierten Breitzeichen-Zeichenkette, auf die str zeigt. Die Trennzeichen werden durch eine nullterminierte Breitzeichen-Zeichenkette identifiziert, auf die delim zeigt.
Diese Funktion ist dafür ausgelegt, mehrfach aufgerufen zu werden, um aufeinanderfolgende Tokens aus derselben Zeichenkette zu erhalten.
  • Falls str ! = NULL , wird der Aufruf als erster Aufruf von wcstok für diese spezielle Breitzeichenkette behandelt. Die Funktion sucht nach dem ersten Breitzeichen, das nicht in delim enthalten ist.
  • Falls kein solches Breitzeichen gefunden wurde, existieren keine Tokens in str , und die Funktion gibt einen Nullzeiger zurück.
  • Falls ein solches Breitzeichen gefunden wurde, stellt es den Beginn des Tokens dar. Die Funktion sucht dann ab diesem Punkt nach dem ersten Breitzeichen, das in delim enthalten ist.
  • Falls kein solches Breitzeichen gefunden wurde, enthält str nur ein Token, und zukünftige Aufrufe von wcstok geben einen Nullzeiger zurück.
  • Falls ein solches Breitzeichen gefunden wurde, wird es ersetzt durch das Null-Breitzeichen L ' \0 ' und der Parserzustand (typischerweise ein Zeiger auf das folgende Breitzeichen) wird im benutzerdefinierten Speicherort * ptr gespeichert.
  • Die Funktion gibt dann den Zeiger auf den Beginn des Tokens zurück.
  • Falls str == NULL , wird der Aufruf als nachfolgender Aufruf von wcstok behandelt: Die Funktion setzt dort fort, wo sie beim vorherigen Aufruf mit demselben * ptr aufgehört hat. Das Verhalten entspricht dem, als ob der Zeiger auf das Breitzeichen, das auf das letzte erkannte Token folgt, als str übergeben wird.
2) Gleich wie (1) , außer dass bei jedem Schritt die Anzahl der noch zu lesenden Zeichen in str in * strmax geschrieben wird. Wiederholte Aufrufe (mit null str ) müssen sowohl strmax als auch ptr mit den Werten des vorherigen Aufrufs übergeben. Zudem werden folgende Laufzeitfehler erkannt, die den aktuell installierten constraint handler aufrufen, ohne etwas in das Objekt zu schreiben, auf das ptr zeigt:
  • strmax , delim oder ptr ist ein Nullzeiger
  • bei einem nicht-initialen Aufruf (mit null str ) ist * ptr ein Nullzeiger
  • beim ersten Aufruf ist * strmax null oder größer als RSIZE_MAX / sizeof ( wchar_t )
  • die Suche nach dem Ende eines Tokens erreicht das Ende der Quellzeichenkette (gemessen am Anfangswert von * strmax ), ohne das Nullterminierungszeichen zu finden
Wie alle bounds-checked-Funktionen ist wcstok_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und der Benutzer __STDC_WANT_LIB_EXT1__ auf den Integer-Konstantenwert 1 setzt, bevor <wchar.h> eingebunden wird.

Inhaltsverzeichnis

Parameter

str - Zeiger auf die nullterminierte Breitzeichen-Zeichenkette, die zu tokenisieren ist
delim - Zeiger auf die nullterminierte Breitzeichen-Zeichenkette, die Trennzeichen identifiziert
ptr - Zeiger auf ein Objekt vom Typ wchar_t * , das sowohl von wcstok als auch von wcstok_s verwendet wird, um den internen Zustand des Parsers zu speichern
strmax - Zeiger auf ein Objekt, das anfänglich die Größe von str enthält: wcstok_s speichert die Anzahl der noch zu untersuchenden Zeichen

Rückgabewert

Gibt einen Zeiger auf den Anfang des nächsten Tokens zurück oder einen Nullzeiger, wenn keine weiteren Tokens vorhanden sind.

Hinweis

Diese Funktion ist destruktiv: Sie schreibt die L ' \0 ' Zeichen in die Elemente des Strings str . Insbesondere kann ein Wide-String-Literal nicht als erstes Argument von wcstok verwendet werden.

Im Gegensatz zu strtok , wcstok aktualisiert keinen statischen Speicher: Es speichert den Parser-Zustand im benutzerbereitgestellten Speicherort.

Im Gegensatz zu den meisten anderen Tokenizern können die Trennzeichen in wcstok für jeden nachfolgenden Token unterschiedlich sein und können sogar von den Inhalten der vorherigen Token abhängen.

Die Implementierung von wcstok_s im Windows CRT ist nicht mit dem C-Standard kompatibel, es handelt sich lediglich um einen Alias für wcstok .

Beispiel

#include <stdio.h>
#include <wchar.h>
int main(void)
{
    wchar_t input[] = L"A bird came down the walk";
    printf("Parsing the input string '%ls'\n", input);
    wchar_t* buffer;
    wchar_t* token = wcstok(input, L" ", &buffer);
    while (token)
    {
        printf("%ls\n", token);
        token = wcstok(NULL, L" ", &buffer);
    }
    printf("Contents of the input string now: '");
    for (size_t n = 0; n < sizeof input / sizeof *input; ++n)
        input[n] ? printf("%lc", input[n]) : printf("\\0");
    puts("'");
}

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'

Referenzen

  • C11-Standard (ISO/IEC 9899:2011):
  • 7.29.4.5.7 Die wcstok-Funktion (S: 437-438)
  • K.3.9.2.3.1 Die wcstok_s-Funktion (S: 645-646)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.24.4.5.7 Die wcstok-Funktion (S: 383-384)

Siehe auch

findet das nächste Token in einer Byte-Zeichenkette
(Funktion)