Zeiger auf eine nullterminierte Zeichenkette, von der gelesen wird
Format
-
Zeiger auf eine nullterminierte Zeichenkette, die angibt, wie die Eingabe gelesen wird
vlist
-
variable Argumentliste mit den empfangenden Argumenten.
Die Format-Zeichenkette besteht aus
Nicht-Leerzeichen-Multibyte-Zeichen außer %: jedes solche Zeichen im Formatstring verbraucht genau ein identisches Zeichen aus dem Eingabestream oder verursacht einen Fehler, wenn das nächste Zeichen im Stream nicht gleich ist.
Leerzeichen: jedes einzelne Leerzeichen im Formatstring verbraucht alle aufeinanderfolgenden Leerzeichen aus der Eingabe (ermittelt wie durch Aufruf von std::isspace in einer Schleife). 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.
(optional) zuweisungsunterdrückendes Zeichen *. Wenn diese Option vorhanden ist, weist die Funktion das Ergebnis der Konvertierung keinem empfangenden Argument zu.
(optional) Ganzzahl (größer als Null), die die maximale Feldbreite angibt, das heißt, 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, das heißt den tatsächlichen Zieltyp. Dies beeinflusst die Konvertierungsgenauigkeit und Überlaufregeln. Der Standard-Zieltyp ist für jeden Konvertierungstyp unterschiedlich (siehe Tabelle unten).
Konvertierungsformatbezeichner.
Die folgenden Formatbezeichner sind verfügbar:
Konvertierungs bezeichner
Erläuterung
Erwarteter Argumenttyp
Längenmodifikator→
hh
h
keiner
l
ll
j
z
t
L
Nur verfügbar seit C++11→
Ja
Ja
Ja
Ja
Ja
%
Entspricht dem Literal %.
N/A
N/A
N/A
N/A
N/A
N/A
N/A
N/A
N/A
c
Entspricht einem Zeichen oder einer Zeichenfolge.
Wenn ein Breitenspezifizierer verwendet wird, werden genau width Zeichen abgeglichen (das Argument muss ein Zeiger auf ein Array mit ausreichend Platz sein).
Im Gegensatz zu %s und %[ wird dem Array kein Nullzeichen angehängt.
N/A
N/A
char*
wchar_t*
N/A
N/A
N/A
N/A
N/A
s
Entspricht einer Folge von Nicht-Leerzeichen (eine Zeichenkette).
Wenn ein Breitenspezifizierer verwendet wird, werden bis zu width oder bis zum ersten Leerzeichen abgeglichen, je nachdem, was zuerst auftritt.
Speichert immer zusätzlich zu den abgeglichenen Zeichen ein Nullzeichen (daher muss das Argumentarray Platz für mindestens width+1 Zeichen haben).
[set ]
Entspricht einer nicht-leeren Folge von Zeichen aus der set von Zeichen.
Wenn das erste Zeichen der Menge ^ ist, werden alle Zeichen, die nicht in der Menge sind, abgeglichen.
Wenn die Menge mit ] oder ^] beginnt, wird das ]-Zeichen ebenfalls in die Menge aufgenommen.
Es ist implementierungsdefiniert, ob das Zeichen - an nicht-initialer Position im Scanset einen Bereich angeben kann, wie in [0-9].
Wenn ein Breitenspezifizierer verwendet wird, werden nur bis zu width abgeglichen.
Speichert immer zusätzlich zu den abgeglichenen Zeichen ein Nullzeichen (daher muss das Argumentarray Platz für mindestens width+1 Zeichen haben).
d
Entspricht einer dezimalen Ganzzahl.
Das Format der Zahl ist das gleiche wie von std::strtol mit dem Wert 10 für das base-Argument erwartet.
signedchar* oder unsignedchar*
signedshort* oder unsignedshort*
signedint* oder unsignedint*
signedlong* oder unsignedlong*
signedlonglong* oder unsignedlonglong*
std::intmax_t* oder std::uintmax_t*
std::size_t*
std::ptrdiff_t*
N/A
b(C++26)
Entspricht einer vorzeichenlosen binären Ganzzahl.
Das Format der Zahl ist das gleiche wie von std::strtoul mit dem Wert 2 für das base-Argument erwartet.
i
Entspricht einer Ganzzahl.
Das Format der Zahl ist das gleiche wie von std::strtol mit dem Wert 0 für das base-Argument erwartet (Basis wird durch die ersten geparsten Zeichen bestimmt).
u
Entspricht einer vorzeichenlosen dezimalen Ganzzahl.
Das Format der Zahl ist das gleiche wie von std::strtoul mit dem Wert 10 für das base-Argument erwartet.
o
Entspricht einer vorzeichenlosen oktalen Ganzzahl.
Das Format der Zahl ist das gleiche wie von std::strtoul mit dem Wert 8 für das base-Argument erwartet.
x X
Entspricht einer vorzeichenlosen hexadezimalen Ganzzahl.
Das Format der Zahl ist das gleiche wie von std::strtoul mit dem Wert 16 für das base-Argument erwartet.
n
Gibt die Anzahl der bisher gelesenen Zeichen zurück.
Es wird keine Eingabe verbraucht. Erhöht die Zuweisungsanzahl nicht.
Wenn der Bezeichner einen zuweisungsunterdrückenden Operator definiert hat, ist das Verhalten undefiniert.
a(C++11) A(C++11) e E f F(C++11) g G
Entspricht einer Gleitkommazahl.
Das Format der Zahl ist das gleiche wie von std::strtof erwartet.
N/A
N/A
float*
double*
N/A
N/A
N/A
N/A
longdouble*
p
Entspricht einer implementierungsdefinierten Zeichenfolge, die einen Zeiger definiert.
printfDie %p-Familie von Funktionen sollte die gleiche Sequenz unter Verwendung des
-Formatbezeichners erzeugen.
N/A
void**
N/A
N/A
N/A
N/A
N/A
N/A
Anmerkungen
Für jeden Konvertierungsbezeichner außer n wird die längste Folge von Eingabezeichen, die keine angegebene Feldbreite überschreitet und die entweder genau das ist, was der Konvertierungsbezeichner erwartet, oder ein Präfix einer Folge, die er erwarten würde, vom Stream verbraucht. Das erste Zeichen, falls vorhanden, nach dieser verbrauchten Folge bleibt ungelesen. Wenn die verbrauchte Folge die Länge Null hat oder wenn die verbrauchte Folge 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 Stream verhindert, in diesem Fall handelt es sich um einen Eingabefehler.
Mit Ausnahme des %-Bezeichners wird das Eingabeelement (oder für %n die Anzahl der Eingabezeichen) zunächst in einen zum Konvertierungsbezeichner passenden Typ konvertiert. Sofern die Zuweisung nicht mit * unterdrückt wurde, wird das Ergebnis der Konvertierung in das Objekt geschrieben, auf das das nächste noch nicht beschriebene Argument zeigt. Wenn dieses Objekt keinen passenden Typ hat oder wenn das Ergebnis der Konvertierung nicht im Objekt dargestellt werden kann, ist das Verhalten undefiniert.
Alle Konvertierungsbezeichner außer [, c und n verbrauchen und verwerfen alle führenden Leerzeichen (ermittelt wie durch Aufruf von std::isspace), bevor sie versuchen, die Eingabe zu parsen. Diese verbrauchten Zeichen zählen nicht zur angegebenen maximalen Feldbreite.
Die Konvertierungsbezeichner lc, ls und l[ führen eine Multibyte-zu-Breitzeichen-Konvertierung 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 Konvertierungsbezeichner s und [ speichern immer zusätzlich zu den abgeglichenen Zeichen den Nullterminator. 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.
Es gibt einen Sequenzpunkt nach der Aktion jedes Konvertierungsbezeichners; dies erlaubt 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 Konvertierungsbezeichner %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 vorhandene 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 Konvertierungsspezifikation ungültig ist, ist das Verhalten undefiniert.
Rückgabewert
Anzahl der erfolgreich gelesenen Argumente, oder
EOF
bei Auftreten eines Fehlers.
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, und dies muss vom Aufrufer durchgeführt werden.