vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
| Definiert in Header <stdio.h> |
||
| int vscanf( const char *restrict format, va_list vlist ); |
(1) | (seit C99) |
| int vfscanf( FILE *restrict stream, const char *restrict format, va_list vlist ); |
(2) | (seit C99) |
| int vsscanf( const char *restrict buffer, const char *restrict format, va_list vlist ); |
(3) | (seit C99) |
| int vscanf_s(const char *restrict format, va_list vlist); |
(4) | (seit C11) |
| int vfscanf_s( FILE *restrict stream, const char *restrict format, va_list vlist); |
(5) | (seit C11) |
| int vsscanf_s( const char *restrict buffer, const char *restrict format, va_list vlist); |
(6) | (seit C11) |
Liest Daten aus verschiedenen Quellen, interpretiert sie gemäß format und speichert die Ergebnisse in Speicherorten, die durch vlist definiert sind.
streambuffer. Das Erreichen des Endes der Zeichenkette ist gleichbedeutend mit dem Erreichen der End-of-File-Bedingung für fscanf.- Einer der Zeigerargumente ist ein Nullzeiger.
-
format,streamoderbufferist ein Nullzeiger. - Die Anzahl der Zeichen, die von %c, %s oder %[ geschrieben würden, plus das terminierende Nullzeichen, würde das zweite (rsize_t) Argument für jeden dieser Konvertierungsspezifizierer überschreiten.
- Optional, jeder andere erkennbare Fehler, wie z.B. ein unbekannter Konvertierungsspezifizierer.
- Wie bei allen grenzgeprüften Funktionen sind
vscanf_s,vfscanf_sundvsscanf_snur dann garantiert verfügbar, wenn __STDC_LIB_EXT1__ von der Implementierung definiert wird und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf die Ganzzahlkonstante 1 setzt, bevor <stdio.h> eingebunden wird.
Inhalt |
[edit] Parameter
| stream | - | Eingabedateistream, aus dem gelesen werden soll. |
| buffer | - | Zeiger auf einen nullterminierten Zeichenstring, aus dem gelesen werden soll |
| format | - | Zeiger auf einen nullterminierten Zeichenstring, der angibt, wie die Eingabe gelesen werden soll |
| vlist | - | Variablenargumentenliste, die die Empfängerargumente enthält. |
Der Formatstring besteht aus
- Nicht-Whitespace-Multibyte-Zeichen außer %: 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 übereinstimmt.
- Whitespace-Zeichen: Jedes einzelne Whitespace-Zeichen in der Formatzeichenkette verbraucht alle aufeinanderfolgenden verfügbaren Whitespace-Zeichen aus der Eingabe (bestimmt, als ob durch Aufruf von isspace in einer Schleife). Beachten Sie, dass es keinen Unterschied zwischen "\n", " ", "\t\t" oder anderen Whitespace-Zeichen 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 Whitespace-Zeichen (bestimmt, als ob durch Aufruf von isspace) vor dem Versuch, die Eingabe zu parsen. Diese verbrauchten Zeichen zählen nicht zur angegebenen maximalen Feldbreite. Die Konvertierungsspezifizierer lc, ls und l[ führen eine Multibyte-zu-Wide-Character-Konvertierung durch, als ob mbrtowc mit einem mbstate_t-Objekt auf Null initialisiert vor der Konvertierung des ersten Zeichens 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 Gleitkommawerts, der im Exponenten mit keinen Ziffern endet, wie beim Parsen von "100er" mit dem Konvertierungsspezifizierer %f, wird die Sequenz "100e" (der längste Präfix einer möglicherweise gültigen Gleitkommazahl) verbraucht, was zu einem passenden Fehler führt (die verbrauchte Sequenz kann nicht in eine Gleitkommazahl konvertiert werden), wobei "r" übrig bleibt. Einige bestehende Implementierungen folgen dieser Regel nicht und rollen zurück, um nur "100" zu verbrauchen, wobei "er" übrig bleibt, z.B. glibc Bug 1765. Wenn eine Konversionsspezifikation ungültig ist, ist das Verhalten undefiniert. | ||||||||||
[edit] Rückgabewert
[edit] Hinweise
Alle diese Funktionen rufen mindestens einmal va_arg auf, der Wert von arg ist nach der Rückgabe unbestimmt. Diese Funktionen rufen va_end nicht auf, und dies muss vom Aufrufer erfolgen.
[edit] Beispiel
#include <stdio.h> #include <stdbool.h> #include <stdarg.h> bool checked_sscanf(int count, const char* buf, const char *fmt, ...) { va_list ap; va_start(ap, fmt); int rc = vsscanf(buf, fmt, ap); va_end(ap); return rc == count; } int main(void) { int n, m; printf("Parsing '1 2'..."); if(checked_sscanf(2, "1 2", "%d %d", &n, &m)) puts("success"); else puts("failure"); printf("Parsing '1 a'..."); if(checked_sscanf(2, "1 a", "%d %d", &n, &m)) puts("success"); else puts("failure"); }
Ausgabe
Parsing '1 2'...success Parsing '1 a'...failure
[edit] Referenzen
- C11-Standard (ISO/IEC 9899:2011)
- 7.21.6.9 Die Funktion vfscanf (S. 327)
- 7.21.6.11 Die Funktion vscanf (S. 328)
- 7.21.6.14 Die Funktion vsscanf (S. 330)
- K.3.5.3.9 Die Funktion vfscanf_s (S. 597-598)
- K.3.5.3.11 Die Funktion vscanf_s (S. 599)
- K.3.5.3.14 Die Funktion vsscanf_s (S. 602)
- C99-Standard (ISO/IEC 9899:1999)
- 7.19.6.9 Die Funktion vfscanf (S. 293)
- 7.19.6.11 Die Funktion vscanf (S. 294)
- 7.19.6.14 Die Funktion vsscanf (S. 295)
[edit] Siehe auch
| (C11)(C11)(C11) |
liest formatierte Eingaben aus stdin, einem Dateistream oder einem Puffer (Funktion) |
| (C99)(C11)(C11)(C11)(C11) |
gibt formatierte Ausgaben nach stdout, an einen Dateistream oder in einen Puffer aus mit variabler Argumentenliste (Funktion) |
| C++-Dokumentation für vscanf, vfscanf, vsscanf
| |