std::vscanf, std::vfscanf, std::vsscanf
| Definiert in Header <cstdio> |
||
| int vscanf( const char* format, std::va_list vlist ); |
(1) | (seit C++11) |
| int vfscanf( std::FILE* stream, const char* format, std::va_list vlist ); |
(2) | (seit C++11) |
| int vsscanf( const char* buffer, const char* format, std::va_list vlist ); |
(3) | (seit C++11) |
Liest Daten aus verschiedenen Quellen, interpretiert sie gemäß format und speichert die Ergebnisse an den von vlist definierten Stellen.
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-Leerzeichen-Multibyte-Zeichen außer %: Jedes solche Zeichen in der Formatzeichenkette verbraucht genau ein identisches Zeichen aus dem Eingabestrom oder führt zu einem Fehler, wenn das nächste Zeichen im Strom nicht übereinstimmt.
- Leerzeichen-Zeichen: Jedes einzelne Leerzeichen-Zeichen in der Formatzeichenkette verbraucht alle aufeinanderfolgenden Leerzeichen-Zeichen aus der Eingabe (ermittelt, als ob std::isspace in einer Schleife aufgerufen würde). 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 empfangenden Argument 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 durch die aktuelle Konvertierungsspezifikation angegebenen Konvertierung 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 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 ab C++11 → | 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* |
std::intmax_t* oder std::uintmax_t* |
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 (C++11)A (C++11)eEfF (C++11)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 gilt: Die längste Folge von Eingabezeichen, die keine angegebene Feldbreite überschreitet und entweder genau dem entspricht, was der Konvertierungsspezifizierer erwartet, oder ein Präfix einer Folge ist, die er erwarten würde, wird aus dem Strom verbraucht. Das erste Zeichen nach dieser verbrauchten Folge bleibt ungelesen. Wenn die verbrauchte Folge eine Länge von Null hat oder wenn die verbrauchte Folge nicht wie oben angegeben konvertiert werden kann, tritt ein Abgleichfehler auf, es sei denn, EOF, ein Kodierungsfehler oder ein Lesefehler hat die Eingabe aus dem Strom verhindert, in welchem Fall es sich um einen Eingabefehler handelt. Alle Konvertierungsspezifizierer außer [, c und n verbrauchen und verwerfen alle führenden Leerzeichen-Zeichen (ermittelt, als ob std::isspace aufgerufen würde), bevor versucht wird, die Eingabe zu parsen. Diese verbrauchten Zeichen zählen nicht zur angegebenen maximalen Feldbreite. Die Konvertierungsspezifizierer lc, ls und l[ führen eine Konvertierung von Multibyte- zu Wide-Zeichen durch, als ob std::mbrtowc 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 den Nullterminator 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 Konvertierungsspezifizierer für die Integer-Typen fester Breite (std::int8_t, etc.) sind im Header <cinttypes> definiert (obwohl SCNdMAX, SCNuMAX, etc. synonym mit %jd, %ju, etc. sind). Nach der Aktion jedes Konvertierungsspezifizierers gibt es einen Sequenzpunkt; dies ermöglicht die Speicherung mehrerer Felder in derselben "Senken"-Variable. Beim Parsen eines unvollständigen Gleitkommawerts, der mit einem Exponenten ohne Ziffern endet, z. B. 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 Übereinstimmungsfehler 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, wodurch "er" übrig bleibt, z. B. glibc-Bug 1765. Wenn eine Konversionsspezifikation ungültig ist, ist das Verhalten undefiniert. | ||||||||||
[edit] Rückgabewert
Anzahl der erfolgreich gelesenen Argumente oder EOF im Fehlerfall.
[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, dies muss vom Aufrufer geschehen.
[edit] Beispiel
#include <cstdarg> #include <cstdio> #include <iostream> #include <stdexcept> void checked_sscanf(int count, const char* buf, const char *fmt, ...) { std::va_list ap; va_start(ap, fmt); if (std::vsscanf(buf, fmt, ap) != count) throw std::runtime_error("parsing error"); va_end(ap); } int main() { try { int n, m; std::cout << "Parsing '1 2'... "; checked_sscanf(2, "1 2", "%d %d", &n, &m); std::cout << "success\n"; std::cout << "Parsing '1 a'... "; checked_sscanf(2, "1 a", "%d %d", &n, &m); std::cout << "success\n"; } catch (const std::exception& e) { std::cout << e.what() << '\n'; } }
Ausgabe
Parsing '1 2'... success Parsing '1 a'... parsing error
[edit] Siehe auch
| liest formatierte Eingaben von stdin, einem Dateistream oder einem Puffer (Funktion) | |
| druckt formatierte Ausgabe nach stdout, einen Dateistream oder einen Puffer mit variabler Argumentenliste (function) | |
| C-Dokumentation für vscanf, vfscanf, vsscanf
| |