std::scanf, std::fscanf, std::sscanf
| Definiert in Header <cstdio>
|
||
int scanf( const char* format, ... );
|
(1) | |
int fscanf( std::FILE* stream, const char* format, ... );
|
(2) | |
int sscanf( const char* buffer, const char* format, ... );
|
(3) | |
Liest Daten aus verschiedenen Quellen, interpretiert sie gemäß format und speichert die Ergebnisse in die angegebenen Speicherorte.
stream.buffer.Parameter
| stream | - | Eingabedateistrom zum Lesen |
| buffer | - | Zeiger auf eine nullterminierte Zeichenkette zum Lesen |
| format | - | Zeiger auf eine nullterminierte Zeichenkette, die angibt, wie die Eingabe gelesen werden soll |
| ... | - | Empfangsargumente |
Die format-Zeichenkette besteht aus
- Nicht-Leerzeichen-Multibyte-Zeichen außer
%: jedes solche Zeichen in der Formatzeichenkette verbraucht genau ein identisches Zeichen aus dem Eingabestrom oder verursacht einen Fehler der Funktion, falls das nächste Zeichen im Strom nicht gleich ist. - Leerzeichen: jedes einzelne Leerzeichen in der Formatzeichenkette verbraucht alle verfügbaren aufeinanderfolgenden Leerzeichen 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.
- Einführendes
- (optional) Zuweisungsunterdrückungszeichen
*. Wenn diese Option vorhanden ist, weist die Funktion das Ergebnis der Konvertierung keinem Empfangsargument zu.
- (optional) Zuweisungsunterdrückungszeichen
- (optional) Ganzzahl (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
%sund%[zu einem Pufferüberlauf führen können, wenn die Breite nicht angegeben wird.
- (optional) Ganzzahl (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
- (optional) Längenmodifikator, der die Größe des Empfangsarguments angibt, d. h. den tatsächlichen Zieltyp. Dies beeinflusst die Konvertierungsgenauigkeit und Überlaufregeln. Der Standard-Zieltyp ist für jeden Konvertierungstyp unterschiedlich (siehe Tabelle unten).
- Konvertierungsformatspezifizierer.
Die folgenden Formatspezifizierer sind verfügbar:
| Konvertierung spezifizierer |
Erläuterung | Erwarteter Argumenttyp | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Längenmodifikator→ | hh
|
h
|
kein | l
|
ll
|
j
|
z
|
t
|
L
| |
| Nur seit C++11 verfügbar→ | Ja | Ja | Ja | Ja | Ja | |||||
%
|
Entspricht dem Literal
%. |
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 (einer Zeichenkette).
| |||||||||
[set ]
|
Entspricht einer nicht-leeren Folge von Zeichen aus der set von Zeichen.
| |||||||||
d
|
Entspricht einer Dezimalzahl.
|
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* |
std::size_t* |
std::ptrdiff_t* |
N/V |
b (C++26)
|
Entspricht einer vorzeichenlosen Binärzahl.
| |||||||||
i
|
Entspricht einer Ganzzahl.
| |||||||||
u
|
Entspricht einer vorzeichenlosen Dezimalzahl.
| |||||||||
o
|
Entspricht einer vorzeichenlosen Oktalzahl.
| |||||||||
xX
|
Entspricht einer vorzeichenlosen Hexadezimalzahl.
| |||||||||
n
|
Gibt die Anzahl der bisher gelesenen Zeichen zurück.
| |||||||||
a (C++11)A (C++11)eEfF (C++11)gG
|
Entspricht einer Gleitkommazahl.
|
N/V | N/V | float* |
double* |
N/V | N/V | N/V | N/V | long double* |
p
|
Entspricht einer implementierungsdefinierten 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 Außer beim Alle Konvertierungsspezifizierer außer Die Konvertierungsspezifizierer Die Konvertierungsspezifizierer Die korrekten Konvertierungsspezifikationen für die Ganzzahltypen mit fester Breite (std::int8_t, usw.) sind im Header <cinttypes> definiert (obwohl SCNdMAX, SCNuMAX, usw. synonym zu Es gibt einen Sequenzpunkt nach der Aktion jedes Konvertierungsspezifizierers; dies erlaubt das Speichern mehrerer Felder in derselben „Senken“-Variablen. Beim Parsen eines unvollständigen Gleitkommawerts, der im Exponenten ohne Ziffern endet, wie z. B. das Parsen von Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten undefiniert. | ||||||||||
Rückgabewert
Anzahl der erfolgreich zugewiesenen Empfangsargumente (kann Null sein, falls ein Matching-Fehler vor der Zuweisung des ersten Empfangsarguments auftrat), oder EOF, falls ein Eingabefehler vor der Zuweisung des ersten Empfangsarguments auftritt.
Komplexität
Nicht garantiert. Insbesondere sind einige Implementierungen von std::sscanf O(N), wobei N = std::strlen(buffer) [1]. Für leistungsstarkes String-Parsing siehe std::from_chars.
Hinweise
Da die meisten Konvertierungsspezifizierer zunächst alle aufeinanderfolgenden Leerzeichen verbrauchen, wird Code wie
std::scanf("%d", &a);
std::scanf("%d", &b);
zwei Ganzzahlen einlesen, die in verschiedenen Zeilen eingegeben werden (der zweite %d verbraucht den von der ersten übriggelassenen Zeilenumbruch) oder in derselben Zeile, getrennt durch Leerzeichen oder Tabulatoren (der zweite %d verbraucht die Leerzeichen oder Tabulatoren).
Die Konvertierungsspezifizierer, die keine führenden Leerzeichen verbrauchen, wie %c, können dazu gebracht werden, indem ein Leerzeichen in der Formatzeichenkette verwendet wird:
std::scanf("%d", &a);
std::scanf(" %c", &c); // ignore the endline after %d, then read a char
Beachten Sie, dass einige Implementierungen von std::sscanf einen Aufruf von std::strlen beinhalten, was ihre Laufzeit linear zur Länge der gesamten Zeichenkette macht. Dies bedeutet, dass wenn std::sscanf in einer Schleife aufgerufen wird, um wiederholt Werte vom Anfang einer Zeichenkette zu parsen, Ihr Code möglicherweise in quadratischer Zeit läuft (Beispiel).
Beispiel
#include <clocale>
#include <cstdio>
#include <iostream>
int main()
{
int i, j;
float x, y;
char str1[10], str2[4];
wchar_t warr[2];
std::setlocale(LC_ALL, "en_US.utf8");
char input[] = "25 54.32E-1 Thompson 56789 0123 56ß水";
// parse as follows:
// %d: an integer
// %f: a floating-point value
// %9s: a string of at most 9 non-whitespace characters
// %2d: two-digit integer (digits 5 and 6)
// %f: a floating-point value (digits 7, 8, 9)
// %*d an integer which isn't stored anywhere
// ' ': all consecutive whitespace
// %3[0-9]: a string of at most 3 digits (digits 5 and 6)
// %2lc: two wide characters, using multibyte to wide conversion
const int ret = std::sscanf(input, "%d%f%9s%2d%f%*d %3[0-9]%2lc",
&i, &x, str1, &j, &y, str2, warr);
std::cout << "Converted " << ret << " fields:\n"
"i = " << i << "\n"
"x = " << x << "\n"
"str1 = " << str1 << "\n"
"j = " << j << "\n"
"y = " << y << "\n"
"str2 = " << str2 << std::hex << "\n"
"warr[0] = U+" << (int)warr[0] << "\n"
"warr[1] = U+" << (int)warr[1] << '\n';
}
Ausgabe:
Converted 7 fields:
i = 25
x = 5.432
str1 = Thompson
j = 56
y = 789
str2 = 56
warr[0] = U+df
warr[1] = U+6c34
Siehe auch
(C++11)(C++11)(C++11) |
liest formatierte Eingabe von stdin, einem Dateistrom oder einem Puffer unter Verwendung einer variablen Argumentliste (Funktion) |
| holt eine Zeichenkette aus einem Dateistrom (Funktion) | |
(C++11) |
gibt formatierte Ausgabe an stdout, einen Dateistrom oder einen Puffer aus (Funktion) |
(C++17) |
konvertiert eine Zeichenfolge in einen Ganzzahl- oder Gleitkommawert (Funktion) |
C-Dokumentation für scanf, fscanf, sscanf
| |