Namespaces
Variants

wcstok, wcstok_s

Aus de.cppreference.net
 
 
 
 
Deklariert im Header <wchar.h>
wchar_t* wcstok( wchar_t* str, const wchar_t* delim, wchar_t** ptr );
(1) (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 Breit-String, auf den str zeigt. Die Trennzeichen werden durch den nullterminierten Breit-String identifiziert, auf den delim zeigt.
Diese Funktion ist dafür ausgelegt, mehrmals aufgerufen zu werden, um aufeinanderfolgende Token aus demselben String zu erhalten.
  • Wenn str != NULL, wird der Aufruf als erster Aufruf von wcstok für diesen bestimmten Breit-String behandelt. Die Funktion sucht nach dem ersten Breitzeichen, das nicht in delim enthalten ist.
  • Wenn kein solches Breitzeichen gefunden wurde, gibt es überhaupt keine Token in str, und die Funktion gibt einen Nullzeiger zurück.
  • Wenn ein solches Breitzeichen gefunden wurde, ist es der Anfang des Tokens. Die Funktion sucht dann von dieser Stelle aus nach dem ersten Breitzeichen, das in delim enthalten ist.
  • Wenn kein solches Breitzeichen gefunden wurde, hat str nur ein Token, und zukünftige Aufrufe von wcstok geben einen Nullzeiger zurück.
  • Wenn ein solches Breitzeichen gefunden wurde, wird es ersetzt durch das Null-Breitzeichen L'\0' und der Parser-Zustand (normalerweise ein Zeiger auf das folgende Breitzeichen) wird in der vom Benutzer bereitgestellten Stelle *ptr gespeichert.
  • Die Funktion gibt dann den Zeiger auf den Anfang des Tokens zurück.
  • Wenn str == NULL, wird der Aufruf als ein nachfolgender Aufruf von wcstok behandelt: Die Funktion setzt dort fort, wo sie beim vorherigen Aufruf mit dem gleichen *ptr aufgehört hat. Das Verhalten ist das gleiche, als ob der Zeiger auf das Breitzeichen, das dem zuletzt erkannten Token folgt, als str übergeben wird.
2) Wie (1), außer dass bei jedem Schritt die Anzahl der noch zu sehenden 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. Außerdem werden die folgenden Fehler zur Laufzeit erkannt und rufen die derzeit installierte Constraint-Handler-Funktion auf, ohne etwas in das Objekt zu speichern, auf das ptr
  • strmax, delim oder ptr ein Nullzeiger ist
  • 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 des Quellstrings (gemessen am Anfangswert von *strmax), ohne auf den Nullterminator zu stoßen
Wie alle grenzgeprüften Funktionen ist wcstok_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor der Einbindung von 1wchar.h< als die Integer-Konstante > definiert.

Parameter

str - Zeiger auf den zu tokenisierenden nullterminierten Breit-String
delim - Zeiger auf den nullterminierten Breit-String, der 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 anfangs 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 oder einen Nullzeiger zurück, wenn es keine weiteren Token gibt.

Hinweis

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

Im Gegensatz zu strtok aktualisiert wcstok keinen statischen Speicher: Es speichert den Parser-Zustand in der vom Benutzer bereitgestellten Stelle.

Im Gegensatz zu den meisten anderen Tokenizern können die Trennzeichen in wcstok für jedes nachfolgende Token unterschiedlich sein und sogar vom Inhalt der vorherigen Token abhängen.

Die Implementierung von wcstok_s in der Windows CRT ist nicht mit dem C-Standard kompatibel; sie ist lediglich ein 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 Funktion wcstok (S. 437-438)
  • K.3.9.2.3.1 Die Funktion wcstok_s (S. 645-646)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.24.4.5.7 Die Funktion wcstok (S. 383-384)

Siehe auch

findet das nächste Token in einem Byte-String
(Funktion)
C++-Dokumentation für wcstok