wscanf, fwscanf, swscanf, wscanf_s, fwscanf_s, swscanf_s
| Definiert in Header <wchar.h> |
||
| (1) | ||
| int wscanf( const wchar_t *format, ... ); |
(seit C95) (bis C99) |
|
| int wscanf( const wchar_t *restrict format, ... ); |
(seit C99) | |
| (2) | ||
| int fwscanf( FILE *stream, const wchar_t *format, ... ); |
(seit C95) (bis C99) |
|
| int fwscanf( FILE *restrict stream, const wchar_t *restrict format, ... ); |
(seit C99) | |
| (3) | ||
| int swscanf( const wchar_t *buffer, const wchar_t *format, ... ); |
(seit C95) (bis C99) |
|
| int swscanf( const wchar_t *restrict buffer, const wchar_t *restrict format, ... ); |
(seit C99) | |
| int wscanf_s( const wchar_t *restrict format, ...); |
(4) | (seit C11) |
| int fwscanf_s( FILE *restrict stream, const wchar_t *restrict format, ...); |
(5) | (seit C11) |
| int swscanf_s( const wchar_t *restrict s, const wchar_t *restrict format, ...); |
(6) | (seit C11) |
Liest Daten aus einer Vielzahl von Quellen, interpretiert sie gemäß format und speichert die Ergebnisse an den angegebenen Orten.
stream.buffer. Das Erreichen des Endes des Strings ist äquivalent zum Erreichen der End-of-File-Bedingung für fwscanf- Einer der Zeigerargumente ist ein Nullzeiger.
-
format,streamoderbufferist ein Nullzeiger. - Die Anzahl der Zeichen, die von %c, %s oder %[ geschrieben würden, zuzüglich des abschließenden Nullzeichens, würde das zweite (
rsize_t) Argument überschreiten, das für jeden dieser Konvertierungsspezifizierer bereitgestellt wird. - Optional, jeder andere erkennbare Fehler, wie z.B. ein unbekannter Konvertierungsspezifizierer.
- Wie alle grenzgeprüften Funktionen sind
wscanf_s,fwscanf_sundswscanf_snur dann garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ vor dem Einbinden von <wchar.h> auf die ganzzahlige Konstante 1 setzt.
Inhalt |
[bearbeiten] Parameter
| stream | - | Eingabedateistream, aus dem gelesen werden soll. |
| buffer | - | Zeiger auf einen nullterminierten Wide-String, aus dem gelesen werden soll. |
| format | - | Zeiger auf einen nullterminierten Wide-String, der angibt, wie die Eingabe gelesen werden soll. |
| ... | - | empfangende Argumente. |
Der Formatstring besteht aus
- Nicht-Leerzeichen-Wide-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 übereinstimmt.
- Leerzeichen: Jedes einzelne Leerzeichen in der Formatzeichenkette verbraucht alle aufeinanderfolgenden Leerzeichen aus der Eingabe (ermittelt, als ob durch Aufruf von iswspace in einer Schleife). Beachten Sie, dass es keinen Unterschied zwischen "\n", " ", "\t\t" oder anderen Leerzeichen in der Formatzeichenkette gibt.
- Konvertierungsspezifikationen. Jede Konvertierungsspezifikation hat das folgende Format:
- Einführendes % Zeichen.
- (optional) Zuweisungsunterdrückendes Zeichen *. Wenn diese Option vorhanden ist, weist die Funktion das Ergebnis der Konvertierung keinem Empfängerargument zu.
- (optional) 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 Pufferüberläufen führen können, wenn die Breite nicht angegeben ist.
- (optional) Längenmodifikator, der die Größe des Empfängerarguments angibt, d.h. den tatsächlichen Zieltyp. Dies wirkt sich auf die Genauigkeit der Konvertierung und die Überlaufregeln aus. Der Standard-Zieltyp ist für jeden Konvertierungstyp unterschiedlich (siehe Tabelle unten).
- Ein Konversionsformat-Spezifizierer.
Die folgenden Format-Spezifizierer sind verfügbar:
| Konversion Spezifizierer |
Erklärung | Erwartet Argumenttyp | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Längenmodifikator → | hh
|
h
|
keine | l
|
ll
|
j
|
z
|
t
|
L
| |
| Nur verfügbar seit C99 → | Ja | Ja | Ja | Ja | Ja | |||||
%
|
Entspricht dem literalen
%. |
N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A |
c
|
Entspricht einem Zeichen oder einer Sequenz von Zeichen.
|
N/A | N/A | char* |
wchar_t* |
N/A | N/A | N/A | N/A | N/A |
s
|
Entspricht einer Sequenz von Nicht-Whitespace-Zeichen (einem String).
| |||||||||
[set ] |
Entspricht einer nicht-leeren Sequenz von Zeichen aus set von Zeichen.
| |||||||||
d
|
Entspricht einer Dezimalganzzahl.
|
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* |
N/A | |||
i
|
Entspricht einer Ganzzahl.
| |||||||||
u
|
Entspricht einer vorzeichenlosen Dezimalganzzahl.
| |||||||||
o
|
Entspricht einer vorzeichenlosen Oktalganzzahl.
| |||||||||
xX
|
Entspricht einer vorzeichenlosen Hexadezimalganzzahl.
| |||||||||
n
|
Gibt die bisher gelesene Anzahl von Zeichen zurück.
| |||||||||
a (C99)A (C99)eEfF (C99)gG
|
Entspricht einer Gleitkommazahl.
|
N/A | N/A | float* |
double* |
N/A | N/A | N/A | N/A | long double* |
p
|
Entspricht einer implementierungsdefinierten Zeichensequenz, die einen Zeiger definiert.
|
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 ist die längste Sequenz von Eingabezeichen, die keine vorgegebene Feldbreite überschreitet und entweder genau dem entspricht, was der Konvertierungsspezifizierer erwartet, oder ein Präfix einer Sequenz ist, die er erwarten würde, das, was aus dem Strom verbraucht wird. 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 spezifiziert konvertiert werden kann, tritt ein Abgleichfehler auf, es sei denn, das Ende der Datei, ein Kodierungsfehler oder ein Lesefehler hat die Eingabe aus dem Strom verhindert, in welchem Fall es ein Eingabefehler ist. Alle Konvertierungsspezifizierer außer [, c und n verbrauchen und verwerfen alle führenden Leerzeichen (ermittelt, als ob durch Aufruf von iswspace), 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 Wide-to-Multibyte-Zeichenkonvertierung durch, als ob wcrtomb mit einem mbstate_t-Objekt, das vor der Konvertierung des ersten Zeichens auf Null initialisiert wurde, aufgerufen würde. Die Konvertierungsspezifizierer s und [ speichern immer den Nullterminator zusätzlich zu den abgeglichenen Zeichen. Die Größe des Zielarrays muss mindestens eins größer sein als die angegebene Feldbreite. Die Verwendung von %s oder %[ ohne Angabe der Zielarraygröße ist genauso unsicher wie gets. Die korrekten Konvertierungsspezifizierer für die Integer-Typen mit fester Breite (int8_t, etc.) sind in der Headerdatei Es gibt einen Sequenzpunkt nach der Ausführung jedes Konvertierungsspezifizierers; dies erlaubt das Speichern mehrerer Felder in derselben "Senken"-Variablen. Beim Parsen eines unvollständigen Fließkommawertes, der mit dem Exponenten ohne Ziffern endet, wie z. B. beim Parsen von "100er" mit dem Konvertierungsspezifizierer %f, wird die Sequenz "100e" (der längste Präfix einer möglicherweise gültigen Fließkommazahl) verbraucht, was zu einem Übereinstimmungsfehler führt (die verbrauchte Sequenz kann nicht in eine Fließkommazahl konvertiert werden), wobei "r" übrig bleibt. Einige bestehende Implementierungen folgen dieser Regel nicht und rollen zurück, um nur "100" zu verbrauchen und lassen "er" übrig, z. B. glibc bug 1765. Wenn eine Konversionsspezifikation ungültig ist, ist das Verhalten undefiniert. | ||||||||||
[bearbeiten] Rückgabewert
[bearbeiten] Beispiel
#include <stdio.h> #include <wchar.h> #include <string.h> #define NUM_VARS 3 #define ERR_READ 2 #define ERR_WRITE 3 int main(void) { wchar_t state[64]; wchar_t capital[64]; unsigned int population = 0; int elevation = 0; int age = 0; float pi = 0; #if INTERACTIVE_MODE wprintf(L"Enter state, age, and pi value: "); if (wscanf(L"%ls%d%f", state, &age, &pi) != NUM_VARS) { fprintf(stderr, "Error reading input.\n"); return ERR_READ; } #else wchar_t* input = L"California 170 3.141592"; if (swscanf(input, L"%ls%d%f", state, &age, &pi) != NUM_VARS) { fprintf(stderr, "Error reading input.\n"); return ERR_READ; } #endif wprintf(L"State: %ls\nAge : %d years\nPi : %.5f\n\n", state, age, pi); FILE* fp = tmpfile(); if (fp) { // write some data to temp file if (!fwprintf(fp, L"Mississippi Jackson 420000 807")) { fprintf(stderr, "Error writing to file.\n"); fclose(fp); return ERR_WRITE; } // rewind file pointer rewind(fp); // read data into variables fwscanf(fp, L"%ls%ls%u%d", state, capital, &population, &elevation); wprintf(L"State : %ls\nCapital: %ls\nJackson population (in 2020): %u\n" L"Highest elevation: %dft\n", state, capital, population, elevation); fclose(fp); } }
Mögliche Ausgabe
State: California Age : 170 years Pi : 3.14159 State : Mississippi Capital: Jackson Jackson population (in 2020): 420000 Highest elevation: 807ft
[bearbeiten] Referenzen
- C11-Standard (ISO/IEC 9899:2011)
- 7.29.2.2 The fwscanf function (S. 410-416)
- 7.29.2.4 The swscanf function (S. 417)
- 7.29.2.12 The wscanf function (S. 421)
- K.3.9.1.2 The fwscanf_s function (S. 628-629)
- K.3.9.1.5 The swscanf_s function (S. 631)
- K.3.9.1.14 The wscanf_s function (S. 638)
- C99-Standard (ISO/IEC 9899:1999)
- 7.24.2.2 The fwscanf function (S. 356-362)
- 7.24.2.4 The swscanf function (S. 362)
- 7.24.2.12 The wscanf function (S. 366-367)
[bearbeiten] Siehe auch
| (C99)(C99)(C99)(C11)(C11)(C11) |
liest formatierte Wide-Character-Eingaben von stdin, einem Dateistrom oder einem Puffer mit variabler Argumentenliste (Funktion) |
| C++ Dokumentation für wscanf, fwscanf, swscanf
| |