Namespaces
Variants

vwscanf, vfwscanf, vswscanf, vwscanf_s, vfwscanf_s, vswscanf_s

Von de.cppreference.net
< c | E/A
 
 
Datei-Eingabe/Ausgabe
Typen und Objekte
        
Funktionen
Dateizugriff
(C95)
Unformatierte Eingabe/Ausgabe
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Formatierte Eingabe
Direkte Eingabe/Ausgabe
Formatierte Ausgabe
Dateipositionierung
Fehlerbehandlung
Operationen auf Dateien
 
Definiert in Header <wchar.h>
int vwscanf( const wchar_t *restrict format, va_list vlist );
(1) (seit C99)
int vfwscanf( FILE *restrict stream,
              const wchar_t *restrict format, va_list vlist );
(2) (seit C99)
int vswscanf( const wchar_t *restrict buffer,
              const wchar_t *restrict format, va_list vlist );
(3) (seit C99)
int vwscanf_s( const wchar_t *restrict format, va_list vlist );
(4) (seit C11)
int vfwscanf_s( FILE *restrict stream,
                const wchar_t *restrict format, va_list vlist );
(5) (seit C11)
int vswscanf_s( const wchar_t *restrict buffer,
                const wchar_t *restrict format, va_list vlist );
(6) (seit C11)

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

1) Liest die Daten von stdin.
2) Liest die Daten aus dem Dateistrom stream.
3) Liest die Daten aus einer nullterminierten breiten Zeichenkette buffer. Das Erreichen des Endes der Zeichenkette entspricht dem Erreichen der Dateiende-Bedingung für fwscanf
4-6) Wie (1-3), außer dass die Konvertierungsspezifizierer %c, %s und %[ jeweils zwei Argumente erwarten (den üblichen Zeiger und einen Wert vom Typ rsize_t, der die Größe des empfangenden Arrays angibt, der 1 sein kann, wenn mit %lc in ein einzelnes breites Zeichen gelesen wird) und außer dass die folgenden Fehler zur Laufzeit erkannt werden und die derzeit installierte Constraint-Handler-Funktion aufrufen:
  • jedes Argument vom Zeigertyp ist ein Nullzeiger
  • format, stream, oder buffer ist ein Nullzeiger
  • die Anzahl der Zeichen, die durch %c, %s oder %[ geschrieben würden, plus das abschließende Nullzeichen, würde das zweite (rsize_t) Argument überschreiten, das für jeden dieser Konvertierungsspezifizierer bereitgestellt wird
  • optional jeder andere erkennbare Fehler, wie z.B. unbekannter Konvertierungsspezifizierer
Wie bei allen grenzgeprüften Funktionen sind vwscanf_s, vfwscanf_s und vswscanf_s nur garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert ist und der Benutzer __STDC_WANT_LIB_EXT1__ auf die ganzzahlige Konstante 1 setzt, bevor <stdio.h> eingebunden wird.

Parameter

stream - Eingabedateistrom zum Lesen
buffer - Zeiger auf eine nullterminierte breite Zeichenkette, aus der gelesen wird
format - Zeiger auf eine nullterminierte breite Zeichenkette, die angibt, wie die Eingabe gelesen werden soll
vlist - variable Argumentliste, die die empfangenden Argumente enthält.


Die format-Zeichenkette besteht aus

  • Nicht-Leerraum-breiten Zeichen außer %: Jedes solche Zeichen in der Formatzeichenkette verbraucht genau ein identisches Zeichen aus dem Eingabestrom oder führt dazu, dass die Funktion fehlschlägt, 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 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) Eine ganze Zahl (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 ist.
  • (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 Standard-Zieltyp ist für jeden Konvertierungstyp unterschiedlich (siehe Tabelle unten).
  • Konvertierungsformat-Spezifizierer.

Die folgenden Formatspezifizierer sind verfügbar:

Konvertierungs
spezifizierer
Erklärung Erwarteter
Argumenttyp
Längenmodifikator→ hh h keiner l ll j z t L
Nur seit C99 verfügbar→ Ja Ja Ja Ja Ja
%
Entspricht literalem %.
N/V N/V N/V N/V N/V N/V N/V N/V N/V
c

Entspricht einem Zeichen oder einer Folge von Zeichen.

  • Wenn ein Breitenspezifizierer verwendet wird, werden genau width breite Zeichen gefunden (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/V N/V
char*
wchar_t*
N/V N/V N/V N/V N/V
s

Entspricht einer Folge von Nicht-Leerraumzeichen (eine Zeichenkette).

  • Wenn ein Breitenspezifizierer verwendet wird, werden bis zu width oder bis zum ersten Leerraumzeichen gefunden, je nachdem, was zuerst auftritt.
  • Speichert immer ein Nullzeichen zusätzlich zu den gefundenen Zeichen (daher muss das Argument-Array Platz für mindestens width+1 Zeichen haben).
[set ]

Entspricht einer nicht leeren Folge von Zeichen aus der set-Menge von Zeichen.

  • Wenn das erste Zeichen der Menge ^ ist, werden alle Zeichen, die nicht in der Menge sind, gefunden.
  • Wenn die Menge mit ] oder ^] beginnt, wird das ]-Zeichen ebenfalls in die Menge aufgenommen.
  • Es ist implementierungsdefiniert, ob das Zeichen - in der nicht-anfänglichen Position im Scanset einen Bereich anzeigen kann, wie in [0-9].
  • Wenn ein Breitenspezifizierer verwendet wird, werden nur bis zu width gefunden.
  • Speichert immer ein Nullzeichen zusätzlich zu den gefundenen Zeichen (daher muss das Argument-Array Platz für mindestens width+1 Zeichen haben).
d

Entspricht einer Dezimalzahl.

  • Das Format der Zahl ist dasselbe wie von wcstol mit dem Wert 10 für das base-Argument erwartet.
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*
intmax_t* oder uintmax_t*
size_t*
ptrdiff_t*
N/V
b (C23)

Entspricht einer vorzeichenlosen Binärzahl.

  • Das Format der Zahl ist dasselbe wie von wcstoul mit dem Wert 2 für das base-Argument erwartet.
i

Entspricht einer ganzen Zahl.

  • Das Format der Zahl ist dasselbe wie von wcstol mit dem Wert 0 für das base-Argument erwartet (Basis wird durch die ersten geparsten Zeichen bestimmt).
u

Entspricht einer vorzeichenlosen Dezimalzahl.

  • Das Format der Zahl ist dasselbe wie von wcstoul mit dem Wert 10 für das base-Argument erwartet.
o

Entspricht einer vorzeichenlosen Oktalzahl.

  • Das Format der Zahl ist dasselbe wie von wcstoul mit dem Wert 8 für das base-Argument erwartet.
x
X

Entspricht einer vorzeichenlosen Hexadezimalzahl.

  • Das Format der Zahl ist dasselbe wie von wcstoul mit dem Wert 16 für das base-Argument erwartet.
n

Gibt die Anzahl der bisher gelesenen Zeichen zurück.

  • Es werden keine Eingaben verbraucht. Erhöht nicht die Zuweisungsanzahl.
  • Wenn der Spezifizierer einen Zuweisungsunterdrückungsoperator definiert hat, ist das Verhalten undefiniert.
a (C99)
A (C99)
e
E
f
F (C99)
g
G

Entspricht einer Gleitkommazahl.

  • Das Format der Zahl ist dasselbe wie von wcstof erwartet.
N/V N/V
float*
double*
N/V N/V N/V N/V
long double*
p

Entspricht einer implementierungsdefinierten Zeichenfolge, die einen Zeiger definiert.

  • printf Die Familie der %p-Funktionen sollte dieselbe Sequenz unter Verwendung des
-Format-Spezifizierers erzeugen. N/V
void**
N/V N/V N/V N/V N/V N/V
Anmerkungen

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

Mit Ausnahme des %-Spezifizierers wird das Eingabeelement (oder für %n die Anzahl der Eingabezeichen) zuerst in einen Typ konvertiert, der für den Konvertierungsspezifizierer geeignet ist. Sofern die Zuweisung nicht mit * unterdrückt wurde, wird das Ergebnis der Konvertierung in das Objekt geschrieben, auf das das nächste Argument zeigt, das noch nicht beschrieben wurde. Wenn dieses Objekt keinen geeigneten Typ hat oder 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 iswspace aufgerufen würde), bevor versucht wird, 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 wcrtomb mit einem mbstate_t-Objekt aufgerufen würde, das vor der ersten Zeichenkonvertierung auf Null initialisiert wurde.

Die Konvertierungsspezifizierer s und [ speichern immer den Nullterminator zusätzlich zu den gefundenen 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 Größe des Zielarrays ist genauso unsicher wie gets.

Die korrekten Konvertierungsspezifikationen für die Ganzzahltypen mit fester Breite (int8_t, usw.) sind im Header <inttypes.h> definiert (obwohl SCNdMAX, SCNuMAX, usw. synonym zu %jd, %ju, usw. sind).

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

Beim Parsen eines unvollständigen Gleitkommawerts, der im 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 kehren zurück, um nur "100" zu verbrauchen, wobei "er" übrig bleibt, z.B. glibc-Fehler 1765.

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

Rückgabewert

1-3) Anzahl der erfolgreich zugewiesenen empfangenden Argumente oder EOF, wenn ein Lesefehler vor der Zuweisung des ersten empfangenden Arguments auftritt.
4-6) Wie (1-3), außer dass EOF auch zurückgegeben wird, wenn eine Laufzeit-Einschränkungsverletzung vorliegt.

Anmerkungen

Alle diese Funktionen können va_arg aufrufen, der Wert von arg ist nach der Rückgabe unbestimmt. Diese Funktionen rufen va_end nicht auf; dies muss vom Aufrufer erfolgen.

Beispiel

Referenzen

  • C11-Standard (ISO/IEC 9899:2011):
  • 7.29.2.6 Die vfwscanf-Funktion (S. 418)
  • 7.29.2.8 Die vswscanf-Funktion (S. 419)
  • 7.29.2.10 Die vwscanf-Funktion (S. 420)
  • K.3.9.1.7 Die vfwscanf_s-Funktion (S. 632-633)
  • K.3.9.1.10 Die vswscanf_s-Funktion (S. 635-636)
  • K.3.9.1.12 Die vwscanf_s-Funktion (S. 637)
  • C99-Standard (ISO/IEC 9899:1999):
  • 7.24.2.6 Die vfwscanf-Funktion (S. 364)
  • 7.24.2.8 Die vswscanf-Funktion (S. 365)
  • 7.24.2.10 Die vwscanf-Funktion (S. 366)

Siehe auch

liest formatierte breite Zeicheneingabe von stdin, einem Dateistrom oder einem Puffer
(Funktion)
C++-Dokumentation für vwscanf, vfwscanf, vswscanf