scanf Breitenangabe
Diese Informationen beziehen sich auf die Interpretation von Formatzeichenfolgen in der scanf-Funktionsreihe, einschließlich der sicheren Versionen wie scanf_s.Diese Funktionen nehmen normalerweise an, dass der Eingabestream in eine Abfolge der Token aufgeteilt wird.Token werden durch Leerzeichen (Leerzeichen, Zeilenvorschub) oder Tabstopps oder im Falle der numerischen Typen, getrennt durch die natürliche Ende eines numerischen Datentyps, wie vom ersten Zeichen angegeben, die nicht in numerischen Text konvertiert werden kann.Die Breitenangabe verwendet werden, um die Analyse der Eingabe dass vor dem natürlichen Ende eines Tokens beenden.
Diese Breitenangabe besteht aus Zeichen zwischen % im Feld Typ und dem Parameterbezeichner, die möglicherweise eine positive ganze Zahl, die das Feld Breite und ein oder mehrere Zeichen angeben die Größe des Felds aufgerufen wird, deren betrachtet werden kann, auch als Modifizierer des Typs des Felds, wie Angabe, ob der ganzzahlige Typ short oder longist.Solche Zeichen als Präfix den Größen.
Das Breiten-Feld
Das FeldBreite ist eine positive ganze Dezimalzahl, die die maximale Anzahl der Steuerelemente für dieses Feld zu lesenden Zeichen.Nicht mehr als breite Zeichen sind am entsprechenden argumentkonvertiert und gespeichert.Weniger als breite Zeichen gelesen werden können, wenn ein Leerzeichen (Leerzeichen, Zeilenvorschub) oder Registerkarte eintritt oder ein Zeichen, die nicht entsprechend dem angegebenen Format konvertiert werden können, bevor Breite erreicht ist.
Diese Breitenangabe getrennt ist und der Puffergrößen - Argument unterschiedlich, das von der sicheren Versionen dieser Funktionen erforderlich ist (d. h. scanf_s, wscanf_susw.).Im folgenden Beispiel ist die Breitenangabe 20 und gibt an, dass bis zu 20 Zeichen aus dem Eingabestream gelesen werden sollen.Die Pufferlänge ist 21, die Platz für die möglichen 20 Zeichen plus NULL-Abschlusszeichen die Folgendes enthält:
char str[21];
scanf_s("%20s", str, 21);
Wenn das Feld Breite nicht verwendet wird, sind scanf_s Lese- das gesamte Token in der Zeichenfolge.Wenn die Größe, die angegeben wurde, nicht groß genug ist, um das gesamte Token enthält, wird nichts in der Zielzeichenfolge geschrieben.Wenn das Feld Breite angegeben wird, dann werden die ersten breite Zeichen im Token in der Zielzeichenfolge zusammen mit dem NULL-Abschlusszeichen geschrieben.
Das Größen-Präfix
Das optionale Präfix, hL, ll, I64und L geben die Größe argument an (kurz, Einzelbytezeichen lang oder Breitzeichen oder je nach Typzeichen, das sie ändern).Diese Formatelemente Zeichen werden mit Typzeichen in scanf oder wscanf-Funktionen verwendet, um Interpretation von Argumenten wie in der folgenden Tabelle gezeigt angeben.Das Präfix des Typs I64 ist eine Microsoft-Erweiterung und ist nicht kompatibel. ANSIDas Typzeichen und ihre Bedeutungen werden in „Typzeichen für scanf funktioniert“ Tabelle in scanf Typ-Feld-Zeichenbeschrieben.
Hinweis |
---|
h, die Lund L Präfixe sind Microsoft-Erweiterungen, wenn sie mit Daten vom Typ charverwendet werden. |
Größen-Präfixe für wscanf und scanf FORMAT-TYPE-Spezifizierer
Angabe von |
Verwenden Sie Präfix |
Der Typspezifizierer |
---|---|---|
double |
L |
e, E, f, goder G |
long double identisch (Double) |
L |
e, E, f, goder G |
long int |
L |
d, I, O, xoder X |
unsigned long int |
L |
u |
lange Dauer |
ll |
d, I, O, xoder X |
short int |
h |
d, I, O, xoder X |
unsigned short int |
h |
u |
int64 |
I64 |
d, I, O, u, xoder X |
Einzelbytezeichen mit scanf |
h |
c oder C |
Einzelbytezeichen mit wscanf |
h |
c oder C |
scanfmit Breitzeichen |
L |
c oder C |
wscanfmit Breitzeichen |
L |
coder C |
Einzelbytezeichenzeichenkette mit scanf |
h |
s oder S |
Einzelbytezeichenzeichenkette mit wscanf |
h |
s oder S |
Eine Zeichenfolge mit Breitzeichen mit scanf |
L |
s oder S |
Eine Zeichenfolge mit Breitzeichen mit wscanf |
L |
s oder S |
Die folgenden Beispiele verwenden h und L mit scanf_s-Funktionen und wscanf_s-Funktionen:
scanf_s( "%ls", &x, 2 ); // Read a wide-character string
wscanf_s( "%hC",&x, 2 ); // Read a single-byte character
Wenn Sie eine unsichere Funktion in der scanf Familie verwenden, lassen Sie den Größenparameter die Pufferlänge des vorherigen Arguments angibt.
Lesen Undelimited-Zeichenfolgen
Um die Zeichenfolgen zu lesen, die durch Leerzeichen getrennt sind, können nicht aus einem Satz von Zeichen in eckigen Klammern ([]) für das Typzeichen s (Zeichenfolge) ersetzt werden.Der Satz von Zeichen in eckigen Klammern wird als eine Zeichenfolge des Steuerelements.Das entsprechende Eingabefeld ist bis zum ersten Zeichen gelesen, das nicht in der Zeichenfolge des Steuerelements angezeigt wird.Wenn das erste Zeichen in der Gruppe ein Zirkumflexzeichen (^) ist, wird der Effekt umgekehrt: Das Eingabefeld ist bis zum ersten Zeichen gelesen, das im Rest des Zeichensatzes angezeigt wird.
Beachten Sie, dass % [a-z] und z-a [%] als Äquivalent zu **% [abcde… Z]**interpretiert werden.Dies ist eine allgemeine scanf-Funktionserweiterung, aber erwähnt, dass der ANSI-Standard sie nicht benötigt.
Lesen von Zeichenfolgen Unterminated
Um eine Zeichenfolge ohne ein NULL- („\ 0 ") speichern zu speichern, verwenden Sie die Spezifikation %nc wobei n eine ganze Dezimalzahl ist.In diesem Fall ist das C Zeichen an, dass das Argument ein Zeiger auf ein Zeichenarray ist.Die folgenden n-Zeichen werden aus dem Eingabestream an der angegebenen Position gelesen, und kein NULL-Zeichen („\ 0 ") angefügt wird.Wenn n nicht angegeben wird, lautet sein Standardwert 1.
Wenn scanf angehalten wird, ein Feld zu lesen
Die scanf-Funktion wird jedes Eingabefeld Zeichen für Zeichen.Er hört auf, um ein bestimmtes Eingabefeld zu lesen, bevor ein Leerzeichen aus mehreren Gründen erreicht:
Die angegebene Breite ist erreicht.
Das nächste Zeichen kann nicht konvertiert werden, wie angegeben.
Das nächste Zeichen steht in Konflikt mit einem Zeichen in der Zeichenfolge des Steuerelements, die sie übereinstimmen soll.
Das nächste Zeichen kann in einem angegebenen Zeichensatz werden nicht angezeigt.
Aus dem Grund immer auch wenn die scanf-Funktion beendet wird, ein Eingabefeld zu lesen, wird das folgende Eingabefeld ungelesenen berücksichtigt beim ersten Zeichen beginnt.Das widersprüchliche Zeichen, sofern vorhanden, wird als ungelesen ist und das erste Zeichen des nächsten Eingabefelds oder das erste Zeichen in den nachfolgenden Lesevorgängen auf dem Eingabestream.
Siehe auch
Referenz
scanf, _scanf_l, wscanf, _wscanf_l
scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l