scanf
Breite Spezifikation
Diese Informationen gelten für die Interpretation von Formatzeichenfolgen in der scanf
-Funktionsreihe, einschließlich der sicheren Versionen wie scanf_s
. Diese Funktionen nehmen in der Regel an, dass der Eingabestream in eine Folge von Token unterteilt ist. Token werden durch Leerzeichen (Leerzeichen, Tabstopp oder Neueinbruch) oder für numerische Typen durch das natürliche Ende eines numerischen Datentyps getrennt, wie durch das erste Zeichen angegeben, das nicht in numerischen Text konvertiert werden kann. Mit den Breitenangaben können Sie jedoch festlegen, dass die Analyse der Eingabe vor dem natürlichen Ende eines Tokens beendet wird.
Die width
Spezifikation besteht aus Zeichen zwischen dem %
Feldbezeichner und dem Typfeldbezeichner, der eine positive ganze Zahl mit dem Namen des width
Felds und ein oder mehrere Zeichen enthalten kann, die die Größe des Felds angeben, die auch als Modifizierer des Feldtyps betrachtet werden können, z. B. ein Hinweis darauf, ob der ganzzahlige Typ ist short
oder long
. Solche Zeichen werden als das Größenpräfix bezeichnet.
Das width
Feld
Das width
Feld ist eine positive Dezimalzahl, die die maximale Anzahl von Zeichen steuert, die für dieses Feld gelesen werden sollen. Nicht mehr als width
Zeichen werden konvertiert und in der entsprechenden argument
Gespeichert. Weniger zeichen als width
zeichen können gelesen werden, wenn ein Leerzeichen oder ein Zeichen, das nicht gemäß dem angegebenen Format konvertiert werden kann, vor width
erreichen.
Die Breitespezifikation ist getrennt und unterscheidet sich vom Argument für die Puffergröße, das von den sicheren Versionen dieser Funktionen (z scanf_s
. B. , , wscanf_s
usw.) benötigt wird. Im folgenden Beispiel beträgt die Breitenangabe 20 und gibt somit an, dass bis zu 20 Zeichen aus dem Eingabestream gelesen werden. Die Pufferlänge beträgt 21 und schließt somit die möglichen 20 Zeichen mit dem Null-Abschlusszeichen ein:
char str[21];
scanf_s("%20s", str, 21);
Wenn das width
Feld nicht verwendet wird, versucht, scanf_s
das gesamte Token in die Zeichenfolge zu lesen. Wenn die angegebene Größe nicht groß genug ist, um das gesamte Token zu halten, wird nichts in die Zielzeichenfolge geschrieben. Wenn das width
Feld angegeben ist, werden die ersten width
Zeichen im Token zusammen mit dem Null-Terminator in die Zielzeichenfolge geschrieben.
Das Größenpräfix
Die optionalen Präfixe h
, hh
, l
, ll
, I64
und L
geben die Größe des argument
(langen oder kurzen, single-byte-Zeichens oder breiten Zeichens, abhängig vom Typzeichen an, das sie ändern). Diese Formatangabezeichen werden in scanf
- oder wscanf
-Funktionen mit Typzeichen für die Interpretation von Argumenten verwendet, wie in der folgenden Tabelle dargestellt. Das Typpräfix I64
ist eine Microsoft-Erweiterung und ist nicht mit Standard C kompatibel. Die Typzeichen und ihre Bedeutungen werden in der Tabelle "Typzeichen für Scanf-Funktionen" in scanf
Typfeldzeichen beschrieben.
Hinweis
Die h
Präfixe l
und L
Präfixe sind Microsoft-Erweiterungen, wenn sie mit Datentypen char
verwendet werden.
Größenpräfixe für Bezeichner vom scanf
wscanf
Typ "Format"
Angabe von | Präfix | Mit Typspezifizierer |
---|---|---|
double |
l |
e , E , f , g oder G |
long double (identisch mit double ) |
L |
e , E , f , g oder G |
long int |
l |
d , i , o , x oder X |
long unsigned int |
l |
u |
long long |
ll |
d , i , o , x oder X |
short int |
h |
d , i , o , x oder X |
short unsigned int |
h |
u |
char |
hh |
d , i , o , x oder X |
unsigned char |
hh |
u |
int64 |
I64 |
d , i , o , u , x oder X |
Einzelbytezeichen mit scanf |
h |
c oder C |
Einzelbytezeichen mit wscanf |
h |
c oder C |
Breitzeichen mit scanf |
l |
c oder C |
Breitzeichen mit wscanf |
l |
c oder C |
Ein-Byte-Zeichenzeichenfolge mit scanf |
h |
s oder S |
Ein-Byte-Zeichenzeichenfolge mit wscanf |
h |
s oder S |
Breite Zeichenfolge mit scanf |
l |
s oder S |
Breite Zeichenfolge mit wscanf |
l |
s oder S |
In den folgenden Beispielen werden Funktionen und wscanf_s
l
scanf_s
Funktionen verwendet:h
scanf_s("%ls", &x, 2); // Read a wide-character string
wscanf_s(L"%hC", &x, 2); // Read a single-byte character
Lassen Sie beim Verwenden einer nicht sicheren Funktion in der scanf
-Reihe den Größenparameter aus, der die Pufferlänge des vorherigen Arguments angibt.
Lesen nicht begrenzter Zeichenfolgen
Um Zeichenfolgen zu lesen, die nicht durch Leerzeichen getrennt sind, kann eine Reihe von Zeichen in Klammern ([ ]
) durch das s
(Zeichenfolgen)-Typzeichen ersetzt werden. Der Satz von Zeichen in eckigen Klammern wird als Steuerelementzeichenfolge bezeichnet. Das entsprechende Eingabefeld wird bis zum ersten Zeichen gelesen, das nicht in der Steuerelementzeichenfolge angezeigt wird. Wenn das erste Zeichen im Satz ein Caretzeichen (^
) ist, wird der Effekt umgekehrt: das Eingabefeld wird bis zum ersten Zeichen gelesen, das im übrigen Zeichensatz enthalten ist.
Beide %[a-z]
und %[z-a]
werden als gleichwertig interpretiert zu %[abcde...z]
. Es handelt sich um eine allgemeine scanf
Funktionserweiterung, ist jedoch nicht von Standard C erforderlich.
Lesen von unterminierten Zeichenfolgen
Um eine Zeichenfolge zu speichern, ohne ein endendes Nullzeichen ('\0') zu speichern, verwenden Sie die Spezifikation %Nc
, wobei N eine dezimale ganze Zahl ist. In diesem Fall gibt das c
Typzeichen an, dass das Argument ein Zeiger auf ein Zeichenarray ist. Die nächsten N-Zeichen werden aus dem Eingabedatenstrom an der angegebenen Position gelesen, und es wird kein Nullzeichen ('\0') angefügt. Wenn N nicht angegeben ist, ist der Standardwert 1.
Wenn scanf
das Lesen eines Felds beendet wird
Die scanf
-Funktion überprüft Zeichen für Zeichen jedes Eingabefeld. Es kann das Lesen eines bestimmten Eingabefelds beenden, bevor es aus einem von mehreren Gründen ein Leerzeichen erreicht:
Die angegebene Breite wurde erreicht.
Das nächste Zeichen kann nicht wie angegeben konvertiert werden.
Das nächste Zeichen steht in Konflikt mit einem Zeichen in der Steuerelementzeichenfolge, das übereinstimmen soll.
Das nächste Zeichen kann nicht in einem angegebenen Zeichensatz angezeigt werden.
Wenn die scanf
-Funktion, unabhängig von dem Grund, das Lesen eines Eingabefelds beendet, beginnt das nächste Eingabefeld beim ersten ungelesenen Zeichen. Das widersprüchliche Zeichen (falls vorhanden) wird als ungelesen betrachtet. Es ist das erste Zeichen des nächsten Eingabefelds oder das erste Zeichen in nachfolgenden Lesevorgängen im Eingabedatenstrom.
Siehe auch
scanf
, , _scanf_l
wscanf
_wscanf_l
scanf_s
, , _scanf_s_l
wscanf_s
_wscanf_s_l
Formatspezifikationsfelder: scanf
und wscanf
Funktionen
scanf
Feldzeichen eingeben