vscanf, vfscanf, vsscanf, vscanf_s, vfscanf_s, vsscanf_s
| Deklariert im 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 einer Vielzahl von Quellen, interpretiert sie gemäß format und speichert die Ergebnisse an den durch vlist definierten Stellen.
streambuffer. Das Erreichen des Endes der Zeichenkette ist gleichbedeutend mit dem Erreichen der Dateiendebedingung für fscanf%c, %s und %[-Konvertierungsspezifizierer jeweils zwei Argumente erwarten (den üblichen Zeiger und einen Wert vom Typ rsize_t, der die Größe des empfangenden Arrays angibt, was 1 sein kann, wenn mit %c in ein einzelnes char 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,streamoderbufferist 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 übersteigen, das für jeden dieser Konvertierungsspezifizierer bereitgestellt wurde
- optional jeder andere erkennbare Fehler, wie z. B. ein unbekannter Konvertierungsspezifizierer
vscanf_s, vfscanf_s und vsscanf_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 | - | Eingabe-Dateistrom, aus dem gelesen wird |
| buffer | - | Zeiger auf eine nullterminierte Zeichenkette, aus der gelesen wird |
| format | - | Zeiger auf eine nullterminierte Zeichenkette, die angibt, wie die Eingabe gelesen werden soll |
| vlist | - | Variable Argumentliste, die die empfangenden Argumente enthält. |
Der format-String besteht aus
- Nicht-Leerzeichen-Multibyte-Zeichen außer
%: Jedes solche Zeichen im Formatstring 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. - Leerzeichen: Jedes einzelne Leerzeichen im Formatstring verbraucht alle verfügbaren aufeinanderfolgenden Leerzeichen aus der Eingabe (ermittelt, als ob isspace in einer Schleife aufgerufen würde). Beachten Sie, dass es keinen Unterschied zwischen
"\n"," ","\t\t"oder anderen Leerzeichen im Formatstring gibt. - Konvertierungsspezifikationen. Jede Konvertierungsspezifikation hat das folgende Format:
- Einführendes
%-Zeichen.
- Einführendes
- (optional) Zuweisungsunterdrückungszeichen
*. Wenn diese Option vorhanden ist, weist die Funktion das Ergebnis der Konvertierung keinem empfangenden Argument zu.
- (optional) Zuweisungsunterdrückungszeichen
- (optional) Ganze Zahl (größer als Null), die die maximale Feldbreite angibt, d. h. die maximale Anzahl von Zeichen, die die Funktion bei der Durchführung der durch die aktuelle Konvertierungsspezifikation angegebenen Konvertierung verbrauchen darf. Beachten Sie, dass
%sund%[zu einem Pufferüberlauf führen können, wenn die Breite nicht angegeben ist.
- (optional) Ganze Zahl (größer als Null), die die maximale Feldbreite angibt, d. h. die maximale Anzahl von Zeichen, die die Funktion bei der Durchführung der durch die aktuelle Konvertierungsspezifikation angegebenen Konvertierung verbrauchen darf. Beachten Sie, dass
- (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 Format-Spezifizierer sind verfügbar:
| Konvertierungs spezifizierer |
Erklärung | Erwarteter Argumenttyp | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Längenmodifikator→ | hh
|
h
|
keiner | l
|
ll
|
j
|
z
|
t
|
L
| |
| Nur verfügbar seit C99→ | Ja | Ja | Ja | Ja | Ja | |||||
%
|
Entspricht einem literalen
%. |
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.
|
N/V | N/V | char* |
wchar_t* |
N/V | N/V | N/V | N/V | N/V |
s
|
Entspricht einer Folge von Nicht-Leerzeichen (einem String).
| |||||||||
[set ]
|
Entspricht einer nicht-leeren Folge von Zeichen aus der set von Zeichen.
| |||||||||
d
|
Entspricht einer dezimalen Ganzzahl.
|
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är-Ganzzahl.
| |||||||||
i
|
Entspricht einer Ganzzahl.
| |||||||||
u
|
Entspricht einer vorzeichenlosen dezimalen Ganzzahl.
| |||||||||
o
|
Entspricht einer vorzeichenlosen oktalen Ganzzahl.
| |||||||||
xX
|
Entspricht einer vorzeichenlosen hexadezimalen Ganzzahl.
| |||||||||
n
|
Gibt die Anzahl der bisher gelesenen Zeichen zurück.
| |||||||||
a (C99)A (C99)eEfF (C99)gG
|
Entspricht einer Gleitkommazahl.
|
N/V | N/V | float* |
double* |
N/V | N/V | N/V | N/V | long double* |
p
|
Entspricht einer implementationsdefinierten Zeichenfolge, die einen Zeiger definiert.
|
N/V | N/V | void** |
N/V | N/V | N/V | N/V | N/V | N/V |
| Hinweise | ||||||||||
|
Für jeden Konvertierungsspezifizierer außer Mit Ausnahme des Alle Konvertierungsspezifizierer außer Die Konvertierungsspezifizierer Die Konvertierungsspezifizierer Die korrekten Konvertierungsspezifikationen für die Ganzzahltypen mit fester Breite (int8_t, usw.) sind im Header <inttypes.h> definiert (obwohl SCNdMAX, SCNuMAX, usw. synonym mit 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 Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten undefiniert. | ||||||||||
Rückgabewert
Hinweise
Alle diese Funktionen rufen va_arg mindestens einmal auf; der Wert von arg ist nach der Rückgabe unbestimmt. Diese Funktionen rufen va_end nicht auf; dies muss vom Aufrufer erledigt werden.
Beispiel
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.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
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
- 7.21.6.9 Die Funktion vfscanf (S. TBD)
- 7.21.6.11 Die Funktion vscanf (S. TBD)
- 7.21.6.14 Die Funktion vsscanf (S. TBD)
- K.3.5.3.9 Die Funktion vfscanf_s (S. TBD)
- K.3.5.3.11 Die Funktion vscanf_s (S. TBD)
- K.3.5.3.14 Die Funktion vsscanf_s (S. TBD)
- C17-Standard (ISO/IEC 9899:2018):
- 7.21.6.9 Die Funktion vfscanf (S. TBD)
- 7.21.6.11 Die Funktion vscanf (S. TBD)
- 7.21.6.14 Die Funktion vsscanf (S. TBD)
- K.3.5.3.9 Die Funktion vfscanf_s (S. TBD)
- K.3.5.3.11 Die Funktion vscanf_s (S. TBD)
- K.3.5.3.14 Die Funktion vsscanf_s (S. TBD)
- 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)
Siehe auch
(C11)(C11)(C11) |
liest formatierte Eingabe von stdin, einem Dateistrom oder einem Puffer (Funktion) |
(C99)(C11)(C11)(C11)(C11) |
gibt formatierte Ausgabe auf stdout, einem Dateistrom oder einem Puffer unter Verwendung einer variablen Argumentliste aus (Funktion) |
C++-Dokumentation für vscanf, vfscanf, vsscanf
| |