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 argumentGespeichert. 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_susw.) 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, I64und 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 hPräfixe lund L Präfixe sind Microsoft-Erweiterungen, wenn sie mit Datentypen charverwendet 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_lwscanf_wscanf_l
scanf_s, , _scanf_s_lwscanf_s_wscanf_s_l
Formatspezifikationsfelder: scanf und wscanf Funktionen
scanf Feldzeichen eingeben