Namespaces
Variants

std:: vwscanf, std:: vfwscanf, std:: vswscanf

From de.cppreference.net
< cpp ‎ | io ‎ | c
Definiert im Header <cwchar>
int vwscanf ( const wchar_t * format, std :: va_list vlist ) ;
(1) (seit C++11)
int vfwscanf ( std:: FILE * stream, const wchar_t * format, std :: va_list vlist ) ;
(2) (seit C++11)
int vswscanf ( const wchar_t * buffer, const wchar_t * format, std :: va_list vlist ) ;
(3) (seit C++11)

Liest Daten aus verschiedenen Quellen, interpretiert sie gemäß format und speichert die Ergebnisse an durch vlist definierten Speicherorten.

1) Liest die Daten von stdin .
2) Liest die Daten aus dem Dateistrom stream .
3) Liest die Daten aus der nullterminierten Breitzeichen-Zeichenkette buffer .

Inhalt

Parameter

stream - Eingabedateistream, aus dem gelesen wird
buffer - Zeiger auf eine nullterminierte Breitzeichenkette, aus der gelesen wird
format - Zeiger auf eine nullterminierte Breitzeichenkette, die angibt, wie die Eingabe gelesen wird
vlist - Variable Argumentliste, die die empfangenden Argumente enthält.


Die Format-Zeichenkette besteht aus

  • Nicht-Leerraum-Breitzeichen, die nicht % sind: Jedes solche Zeichen in der Formatzeichenkette verbraucht genau ein identisches Zeichen aus dem Eingabestrom oder führt zum Fehlschlagen der Funktion, wenn das nächste Zeichen im Strom nicht gleich ist.
  • Leerraumzeichen: Ein einzelnes Leerraumzeichen in der Formatzeichenkette verbraucht alle verfügbaren aufeinanderfolgenden Leerraumzeichen aus der Eingabe (bestimmt, als ob std::iswspace in einer Schleife aufgerufen würde). Beachten Sie, dass es keinen Unterschied zwischen "\n", " ", "\t\t" oder anderen Leerraumzeichen in der Formatzeichenkette gibt.
  • Konvertierungsspezifikationen. Jede Konvertierungsspezifikation hat das folgende Format:
  • Einleitendes %-Zeichen.
  • (optional) Zuweisungsunterdrückungszeichen *. Wenn diese Option vorhanden ist, weist die Funktion das Ergebnis der Konvertierung keinem empfangenden Argument zu.
  • (optional) Ganzzahl (größer als Null), die die maximale Feldbreite angibt, d.h. die maximale Anzahl von Zeichen, die die Funktion bei der Konvertierung gemäß der aktuellen Konvertierungsspezifikation verbrauchen darf. Beachten Sie, dass %s und %[ zu einem Pufferüberlauf führen können, wenn die Breite nicht angegeben wird.
  • (optional) Längenmodifikator, der die Größe des empfangenden Arguments angibt, d.h. den tatsächlichen Zieltyp. Dies beeinflusst die Konvertierungsgenauigkeit und die Überlaufregeln. Der Standardzieltyp ist für jeden Konvertierungstyp unterschiedlich (siehe Tabelle unten).
  • Konvertierungsformatspezifizierer.

Die folgenden Formatspezifizierer sind verfügbar:

Konvertierungs
spezifizierer
Erklärung Erwarteter
Argumenttyp
Längenmodifikator→ hh h keiner l ll j z t L
Nur verfügbar seit C++11→ Ja Ja Ja Ja Ja
%
Entspricht dem Literal %.
N/A N/A N/A N/A N/A N/A N/A N/A N/A
c

N/AEntspricht einem Zeichen oder einer Folge von Zeichen

  • . Wenn ein Breitenspezifizierer verwendet wird, werden genau width
  • Breitzeichen abgeglichen (das Argument muss ein Zeiger auf ein Array mit ausreichend Platz sein). Im Gegensatz zu %s und
%[, wird das Nullzeichen nicht an das Array angehängt. N/A
char*
wchar_t*
N/A N/A N/A N/A N/A
s

N/AEntspricht einer Folge von Nicht-Leerraumzeichen (einer Zeichenkette

  • ). Wenn ein Breitenspezifizierer verwendet wird, werden maximal width
  • Zeichen oder bis zum ersten Leerraumzeichen abgeglichen, je nachdem, was zuerst eintritt.Zusätzlich zu den abgeglichenen Zeichen wird immer ein Nullzeichen gespeichert (daher muss das Argumentarray Platz für mindestens width+1
[ Zeichen haben). ]

setEntspricht einer nicht leeren Zeichenfolge aus dem Zeichensatz set

  • . ^Wenn das erste Zeichen des Satzes
  • ist, werden alle Zeichen, die nicht im Satz sind, abgeglichen.]Wenn der Satz mit ^] oder ] beginnt, wird das Zeichen
  • ebenfalls in den Satz aufgenommen.-Es ist implementationsdefiniert, ob das Zeichen [0-9] an nicht-initialer Position im Scanset einen Bereich angeben darf, wie in
  • .Wenn ein Breitenspezifizierer verwendet wird, werden nur bis zu width
  • Zeichen abgeglichen.Zusätzlich zu den abgeglichenen Zeichen wird immer ein Nullzeichen gespeichert (daher muss das Argumentarray Platz für mindestens width+1
d

Zeichen haben).Entspricht einer Dezimalzahl

  • . Das Zahlenformat entspricht dem, das von std::wcstol10 mit dem Wert base für das Basisargument erwartet wird.
signed char* oder unsigned char*
signed short* oder unsigned short*
signed int* oder unsigned int*
signed long* oder unsigned long*
signed long long* oder unsigned long long*
std::intmax_t* oder std::uintmax_t*
std::size_t*
std::ptrdiff_t*
N/A
b (C++26)

Entspricht einer vorzeichenlosen Binärzahl.

  • Das Zahlenformat entspricht dem, das von std::wcstoul mit dem Wert 2 für das Basisargument erwartet wird.baseEntspricht einer
i

Ganzzahl. Das Zahlenformat entspricht dem, das von

  • std::wcstol mit dem Wert für das Basisargument erwartet wird (die Basis wird durch die ersten geparsten Zeichen bestimmt).0Entspricht einer vorzeichenlosen baseDezimalzahl
u

. Das Zahlenformat entspricht dem, das von std::wcstoul

  • mit dem Wert für das Basisargument erwartet wird.Entspricht einer vorzeichenlosen 10Oktalzahlbase.
o

Das Zahlenformat entspricht dem, das von std::wcstoul mit dem Wert

  • für das Basisargument erwartet wird.Entspricht einer vorzeichenlosen Hexadezimalzahl8. baseDas Zahlenformat entspricht dem, das von
x
X

std::wcstoul mit dem Wert für das Basisargument erwartet wird.

  • Gibt die Anzahl der bisher gelesenen Zeichen zurück. 16Es werden keine Eingaben verbraucht. Erhöht nicht die Zuweisungsanzahl.baseWenn für den Spezifizierer der Zuweisungsunterdrückungsoperator definiert ist, ist das Verhalten undefiniert.
n

(C++11)(C++11)(C++11)

  • Entspricht einer
  • Gleitkommazahl
a .
A Das Zahlenformat entspricht dem, das von
e
E
f
F std::wcstof
g
G

erwartet wird.N/AN/A

  • N/AN/AN/A
N/A N/A
float*
double*
Entspricht einer implementationsdefinierten Zeichenfolge, die einen Zeiger definiert. Die
long double*
p

-Familie von Funktionen sollte dieselbe Sequenz mit dem Formatspezifizierer erzeugen.N/A

  • printfN/A%pN/A
N/A N/A
void**
N/A N/A N/A N/A N/A N/A
Anmerkungen

Für jeden Konvertierungsspezifizierer außer n wird die längste Folge von Eingabezeichen, die keine angegebene Feldbreite überschreitet und die entweder genau das ist, was der Konvertierungsspezifizierer erwartet, oder ein Präfix einer von ihm erwarteten Folge ist, vom Strom verbraucht. Das erste Zeichen, falls vorhanden, nach dieser verbrauchten Folge bleibt ungelesen. Wenn die verbrauchte Folge die Länge Null hat oder wenn die verbrauchte Folge nicht wie oben angegeben konvertiert werden kann, tritt ein Übereinstimmungsfehler auf, es sei denn, das Dateiende, ein Kodierungsfehler oder ein Lesefehler haben die Eingabe vom Strom verhindert, in diesem Fall liegt ein Eingabefehler vor.

Außer für den %-Spezifizierer wird das Eingabeelement (oder für %n die Anzahl der Eingabezeichen) zuerst in einen für den Konvertierungsspezifizierer geeigneten Typ konvertiert. Sofern die Zuweisung nicht mit * unterdrückt wurde, wird das Ergebnis der Konvertierung in das Objekt geschrieben, auf das das nächste noch nicht beschriebene Argument zeigt. Wenn dieses Objekt keinen geeigneten Typ hat oder wenn das Ergebnis der Konvertierung nicht im Objekt dargestellt werden kann, ist das Verhalten undefiniert.

Alle Konvertierungsspezifizierer außer [, c und n verbrauchen und verwerfen alle führenden Leerraumzeichen (bestimmt, als ob std::iswspace aufgerufen würde), bevor sie versuchen, die Eingabe zu parsen. Diese verbrauchten Zeichen zählen nicht zur angegebenen maximalen Feldbreite.

Wenn der Längenspezifizierer l nicht verwendet wird, führen die Konvertierungsspezifizierer c, s und [ eine Breit-zu-Mehrbyte-Zeichenkonvertierung durch, als ob std::wcrtomb mit einem std::mbstate_t-Objekt aufgerufen würde, das vor der Konvertierung des ersten Zeichens auf Null initialisiert wurde.

Die Konvertierungsspezifizierer s und [ speichern immer das Nullterminierungszeichen zusätzlich zu den abgeglichenen Zeichen. Die Größe des Zielarrays muss mindestens um eins größer sein als die angegebene Feldbreite. Die Verwendung von %s oder %[ ohne Angabe der Zielarraygröße ist genauso unsicher wie std::gets.

Die korrekten Konvertierungsspezifikationen für die Ganzzahltypen mit fester Breite (std::int8_t usw.) sind in der Headerdatei <cinttypes> definiert (obwohl SCNdMAX, SCNuMAX usw. synonym zu %jd, %ju usw. sind).

Es gibt einen Sequenzpunkt nach der Aktion jedes Konvertierungsspezifizierers; dies erlaubt das Speichern mehrerer Felder in derselben „Senken“-Variable.

Beim Parsen eines unvollständigen Gleitkommawerts, der mit einem Exponenten ohne Ziffern endet, wie z.B. beim Parsen von "100er" mit dem Konvertierungsspezifizierer %f, wird die Sequenz "100e" (das längste Präfix einer möglicherweise gültigen Gleitkommazahl) verbraucht, was zu einem Übereinstimmungsfehler führt (die verbrauchte Sequenz kann nicht in eine Gleitkommazahl konvertiert werden), wobei "r" übrig bleibt. Einige vorhandene Implementierungen folgen dieser Regel nicht und gehen zurück, um nur "100" zu verbrauchen, so dass "er" übrig bleibt, z.B. glibc Fehler 1765.

Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten undefiniert.

Rückgabewert

Anzahl der erfolgreich gelesenen Argumente, oder EOF bei Auftreten eines Fehlers.

Beispiel

Siehe auch

liest formatierten Breitzeichen-Input von stdin , einem Dateistream oder einem Buffer
(Funktion)
C-Dokumentation für vwscanf , vfwscanf , vswscanf