scanf ()- Daten Lesen
Format
#include <stdio.h>
int scanf(const char *format-string, argument-list);Sprachniveau
ANSI
Sicher für Threads
Ja
Länderspezifisch
Das Verhalten dieser Funktion kann sich auf die Kategorien LC_CTYPE und LC_NUMERIC der aktuellen Ländereinstellung auswirken. Das Verhalten kann sich auch auf die Kategorie LC_UNI_CTYPE der aktuellen Ländereinstellung auswirken, wenn LOCALETYPE (*LOCALEUCS2) oder LOCALETYPE (*LOCALEUTF) im Kompilierbefehl angegeben ist. Weitere Informationen finden Sie unter CCSIDs und Ländereinstellungen verstehen.
Beschreibung
Die Funktion scanf() liest Daten aus dem Standardeingabedatenstrom stdin an die Positionen, die durch jeden Eintrag in Argumentlisteangegeben werden. Jedes Argument muss ein Zeiger auf eine Variable mit einem Typ sein, der einer Typkennung in formatzeichenfolgeentspricht. Die formatzeichenfolge steuert die Interpretation der Eingabefelder und ist eine Mehrbytezeichenfolge, die in ihrem ursprünglichen Schichtstatus beginnt und endet.
- Leerzeichen, wie von der
isspace()-Funktion angegeben (z. B. Leerzeichen und Zeilenvorschubzeichen). Ein Leerzeichen bewirkt, dass die Funktionscanf()alle aufeinanderfolgenden Leerzeichen in der Eingabe bis zum nächsten Zeichen, das kein Leerzeichen ist, liest, aber nicht speichert. Ein Leerzeichen in formatzeichenfolge entspricht einer beliebigen Kombination von Leerzeichen in der Eingabe. - Zeichen, die keine Leerzeichen sind, mit Ausnahme des Prozentzeichens (%). Ein Zeichen, das kein Leerzeichen ist, bewirkt, dass die Funktion
scanf()ein übereinstimmendes Zeichen, das kein Leerzeichen ist, liest, aber nicht speichert. Wenn das nächste Zeichen instdinnicht übereinstimmt, wird die Funktionscanf()beendet. - Formatspezifikationen, eingeführt durch das Prozentzeichen (%). Eine Formatspezifikation bewirkt, dass die Funktion
scanf()Zeichen in der Eingabe liest und in Werte eines angegebenen Typs konvertiert. Der Wert wird einem Argument in der Argumentliste zugeordnet.
Die Funktion scanf() liest formatzeichenfolge von links nach rechts. Es wird erwartet, dass Zeichen außerhalb der Formatspezifikationen der Zeichenfolge in stdinentsprechen; die übereinstimmenden Zeichen in stdin werden durchsucht, aber nicht gespeichert. Wenn ein Zeichen in stdin mit formatzeichenfolgein Konflikt steht, endet scanf() . Das widersprüchliche Zeichen bleibt in stdin , als wäre es nicht gelesen worden.
Wenn die erste Formatspezifikation gefunden wird, wird der Wert des ersten Eingabefelds gemäß der Formatspezifikation konvertiert und an der Position gespeichert, die durch den ersten Eintrag in Argumentlisteangegeben wird. Die zweite Formatspezifikation konvertiert das zweite Eingabefeld und speichert es im zweiten Eintrag in Argumentlisteusw. bis zum Ende von formatzeichenfolge.
Ein Eingabefeld ist definiert als alle Zeichen bis zum ersten Leerzeichen (Leerzeichen, Tabulatorzeichen oder Zeilenvorschubzeichen), bis zum ersten Zeichen, das nicht gemäß der Formatspezifikation konvertiert werden kann, oder bis das Feld Breite erreicht ist, je nachdem, was zuerst eintritt. Wenn zu viele Argumente für die Formatspezifikationen vorhanden sind, werden die zusätzlichen Argumente ignoriert. Die Ergebnisse sind nicht definiert, wenn nicht genügend Argumente für die Formatspezifikationen vorhanden sind.
Eine Formatspezifikation hat das folgende Format:
Jedes Feld der Formatspezifikation ist ein einzelnes Zeichen oder eine Zahl, die eine bestimmte Formatoption angibt. Das Zeichen type , das nach dem letzten optionalen Formatfeld angezeigt wird, legt fest, ob das Eingabefeld als Zeichen, Zeichenfolge oder Zahl interpretiert wird. Die einfachste Formatspezifikation enthält nur das Prozentzeichen und ein Zeichen Typ (z. B. %s).
Jedes Feld der Formatspezifikation wird im Folgenden ausführlich erläutert. Wenn auf ein Prozentzeichen (%) ein Zeichen folgt, das keine Bedeutung als Formatsteuerzeichen hat, ist das Verhalten nicht definiert. Eine Ausnahme von diesem Verhalten ist %%. Um ein Prozentzeichen anzugeben, verwenden Sie %%.
- Wird ein Zeiger ausgedruckt und von derselben Aktivierungsgruppe zurückgescannt, wird der zurückgescannte Zeiger mit dem ausgedruckten Zeiger verglichen.
- Wenn eine
scanf()-Familienfunktion einen Zeiger scannt, der von einer anderen Aktivierungsgruppe ausgegeben wurde, setzt diescanf()-Familienfunktion den Zeiger auf NULL.
Weitere Informationen zur Verwendung von IBM® i Zeigern finden Sie im Handbuch ILE C/C++ Programmer's Guide .
Ein Stern (*) nach dem Prozentzeichen unterdrückt die Zuordnung des nächsten Eingabefelds, das als Feld des angegebenen Typsinterpretiert wird. Das Feld wird gescannt, aber nicht gespeichert.
Die Breite ist eine positive Dezimalzahl, die die maximale Anzahl von Zeichen steuert, die aus stdingelesen werden können. Maximal Breite Zeichen werden konvertiert und im entsprechenden Argumentgespeichert. Weniger als Breite Zeichen werden gelesen, wenn ein Leerzeichen (Leerzeichen, Tabulator oder neue Zeile) oder ein Zeichen, das nicht gemäß dem angegebenen Format konvertiert werden kann, vor dem Erreichen von Breite auftritt.
Die optionalen Größenmodifikatoren h, l, ll, L, H, D und DD geben die Größe des empfangenden Objekts an. Den Konvertierungszeichen d, i und n muss h vorangestellt werden, wenn das entsprechende Argument ein Zeiger auf eine kurze Ganzzahl ist und nicht ein Zeiger auf eine Ganzzahl, l, wenn es ein Zeiger auf eine lange Ganzzahl ist, oder ll, wenn es ein Zeiger auf eine lange Ganzzahl ist. In ähnlicher Weise müssen den Konvertierungszeichen o, u, x und X h vorangestellt werden, wenn das entsprechende Argument ein Zeiger auf eine kurze Ganzzahl ohne Vorzeichen und kein Zeiger auf eine Ganzzahl ohne Vorzeichen ist, l, wenn es sich um einen Zeiger auf eine lange Ganzzahl ohne Vorzeichen handelt, oder ll, wenn es sich um einen Zeiger auf eine lange Ganzzahl ohne Vorzeichen handelt. Den Konvertierungszeichen a, A, e, E, f, F, g und G muss ein l vorangestellt werden, wenn das entsprechende Argument ein Zeiger auf einen Doppelwert und nicht ein Zeiger auf einen Gleitkommawert ist, ein L, wenn es ein Zeiger auf einen langen Doppelwert ist, ein H, wenn es ein Zeiger auf einen _Decimal32ist, ein D, wenn es ein Zeiger auf einen _Decimal64ist, oder ein DD, wenn es ein Zeiger auf einen _Decimal128ist. Schließlich müssen den Konvertierungszeichen c, s und [ l vorangestellt werden, wenn das entsprechende Argument ein Zeiger auf wchar_t und kein Zeiger auf einen Einzelbytezeichentyp ist. Wenn h, l, L, ll, H, D oder DD mit einem anderen Konvertierungszeichen angezeigt wird, ist das Verhalten nicht definiert.
Die Zeichen type und ihre Bedeutung sind in der folgenden Tabelle aufgeführt:
| Zeichen | Typ der erwarteten Eingabe | Argumenttyp |
|---|---|---|
| d | Dezimalzahl mit Vorzeichen | Zeiger auf int. |
| o | Oktalzahl ohne Vorzeichen | Zeiger auf int ohne Vorzeichen. |
| x, X | Hexadezimale Ganzzahl ohne Vorzeichen | Zeiger auf int ohne Vorzeichen. |
| i | Dezimal-, Hexadezimal-oder Oktalzahl | Zeiger auf int. |
| u | Ganze Dezimalzahl ohne Vorzeichen | Zeiger auf int ohne Vorzeichen. |
| a, A, e, E, f, F, g, G | Bei nicht dezimalen Fließkommazahlen eine vorzeichenbehaftete Fließkommazahl, Unendlichkeit oder NaN, deren Format dem der Funktion strtod() entspricht. Bei dezimalen Fließkommazahlen eine optional vorzeichenbehaftete Fließkommazahl, Unendlichkeit oder NaN, deren Format dem der Funktion strtod64() entspricht. |
Zeiger auf Gleitkomma |
| D (n, p) | Gepackter Dezimalwert, der aus einem optionalen Vorzeichen (+ oder-) besteht; anschließend eine nicht leere Folge von Ziffern, optional eine Reihe von einer oder mehreren Dezimalziffern, die möglicherweise ein Dezimalzeichen, aber kein Dezimalsuffix enthalten. Die Subjektfolge ist als längste anfängliche Teilfolge der Eingabezeichenfolge definiert, beginnend mit dem ersten Zeichen, das kein Leerzeichen ist, im erwarteten Format. Sie enthält keine Zeichen, wenn die Eingabezeichenfolge leer ist oder vollständig aus Leerzeichen besteht oder wenn das erste Zeichen, das kein Leerzeichen ist, nichts anderes als ein Zeichen, eine Ziffer oder ein Dezimalzeichen ist. | Zeiger auf decimal (n, p). Da die interne Darstellung des binär codierten Dezimalobjekts der internen Darstellung des gepackten Dezimaldatentyps entspricht, können Sie den Typ Zeichen D (n, p) verwenden. |
| c | Zeichen; Leerzeichen, die normalerweise übersprungen werden, werden gelesen, wenn c angegeben wird. | Zeiger auf char groß genug für Eingabefeld. |
| s | Zeichenfolge | Zeiger auf Zeichenarray, der groß genug für das Eingabefeld ist, plus ein abschließendes Nullzeichen (\0), das automatisch angehängt wird |
| n | Keine Eingabe aus Datenstrom oder Puffer gelesen | Zeiger auf int, in dem die Anzahl der Zeichen gespeichert wird, die erfolgreich aus dem Datenstrom oder Puffer bis zu diesem Punkt im Aufruf an scanf()gelesen wurden. |
| p | Zeiger auf void konvertiert in eine Reihe von Zeichen | Zeiger auf void. |
| lc | Mehrbytezeichenkonstante | Zeiger auf wchar_t. |
| ls | Mehrbyte-Zeichenfolgekonstante | Zeiger auf Zeichenfolge 'wchar_t'. |
Um Zeichenfolgen zu lesen, die nicht durch Leerzeichen begrenzt sind, ersetzen Sie das Zeichen des Typs s (Zeichenfolge) durch eine Gruppe von Zeichen in eckigen Klammern ([]). Das entsprechende Eingabefeld wird bis zum ersten Zeichen gelesen, das nicht im in Klammern eingeschlossenen Zeichensatz vorkommt. Wenn das erste Zeichen im Satz ein Winkelzeichen (^) ist, wird der Effekt umgekehrt: Das Eingabefeld wird bis zum ersten Zeichen gelesen, das im Rest des Zeichensatzes vorkommt.
Um eine Zeichenfolge zu speichern, ohne ein abschließendes Nullzeichen (\0) zu speichern, verwenden Sie die Spezifikation %ac, wobei a eine Dezimalzahl ist. In diesem Fall bedeutet das Zeichen c , dass das Argument ein Zeiger auf ein Zeichenarray ist. Die nächsten Zeichen a werden aus dem Eingabedatenstrom an die angegebene Position gelesen und es wird kein Nullzeichen hinzugefügt.
Die Eingabe für die Formatkennung %x wird als Hexadezimalzahl interpretiert.
Die Funktion scanf() durchsucht jedes Eingabefeld zeichenweise. Es kann das Lesen eines bestimmten Eingabefelds stoppen, bevor es ein Leerzeichen erreicht, wenn die angegebene Breite erreicht ist oder wenn das nächste Zeichen nicht wie angegeben konvertiert werden kann. Tritt ein Konflikt zwischen der Spezifikation und dem Eingabezeichen auf, beginnt das nächste Eingabefeld beim ersten ungelesenen Zeichen. Das widersprüchliche Zeichen (sofern vorhanden) gilt als ungelesen und ist das erste Zeichen des nächsten Eingabefelds oder das erste Zeichen in nachfolgenden Leseoperationen unter stdin.
Gibt für %lc und %ls an, dass die Daten, die gelesen werden, eine Mehrbytezeichenfolge sind und wie durch Aufrufe von mbtowcin Breitzeichen konvertiert werden.
Für die Formatkennungen %a, %B, %e, %E, %f, %F, %gund %G eine Zeichenfolge vonINFINITYoderNAN(Groß-/Kleinschreibung ignorieren) ist zulässig und ergibt den Wert INFINITY bzw. Quiet Not-A-Number (NaN).
Alternativ können bestimmte Einträge in der Argumentliste zugeordnet werden, indem die Formatspezifikation verwendet wird, die im obigen Diagramm dargestellt ist. Diese Formatspezifikation und die vorherige Formatspezifikation dürfen nicht in demselben Aufruf von scanf()gemischt werden. Andernfalls können unvorhersehbare Ergebnisse auftreten.
Die Argumentnummer ist eine positive ganzzahlige Konstante, wobei 1 auf den ersten Eintrag in der Argumentliste verweist. Argumentanzahl darf nicht größer als die Anzahl der Einträge in der Argumentliste sein oder die Ergebnisse sind nicht definiert. Argumentnummer darf auch nicht größer als NL_ARGMAX sein.
Rückgabewert
Die Funktion scanf() gibt die Anzahl der erfolgreich konvertierten und zugewiesenen Felder zurück. Der Rückgabewert enthält keine Felder, die gelesen, aber nicht zugeordnet wurden.
Der Rückgabewert ist EOF für einen Versuch, am Dateiende zu lesen, wenn keine Konvertierung durchgeführt wurde. Der Rückgabewert 0 bedeutet, dass keine Felder zugewiesen wurden.
Fehlerbedingungen
Wenn der Typ des Arguments, dem zugeordnet werden soll, von der Formatspezifikation abweicht, können unvorhersehbare Ergebnisse auftreten. Beispielsweise ist das Lesen eines Gleitkommawerts, aber das Zuordnen des Werts zu einer Variablen des Typs intfalsch und führt zu unvorhersehbaren Ergebnissen.
Wenn mehr Argumente als Formatspezifikationen vorhanden sind, werden die zusätzlichen Argumente ignoriert. Die Ergebnisse sind nicht definiert, wenn nicht genügend Argumente für die Formatspezifikationen vorhanden sind.
Wenn die Formatzeichenfolge eine ungültige Formatspezifikation enthält und positionsgebundene Formatspezifikationen verwendet werden, wird errno auf EILSEQ gesetzt.
Wenn positionsgebundene Formatspezifikationen verwendet werden und nicht genügend Argumente vorhanden sind, wird errno auf EINVAL gesetzt.
Wenn ein Konvertierungsfehler auftritt, kann errno auf ECONVERTgesetzt werden.
Beispiele
#include <stdio.h>
int main(void)
{
int i;
float fp;
char c, s[81];
printf("Enter an integer, a real number, a character "
"and a string : \n");
if (scanf("%d %f %c %s", &i, &fp, &c, s) != 4)
printf("Not all fields were assigned\n");
else
{
printf("integer = %d\n", i);
printf("real number = %f\n", fp);
printf("character = %c\n", c);
printf("string = %s\n",s);
}
}
/***************** If input is: 12 2.5 a yes, *******************
************** then output should be similar to: ****************
Enter an integer, a real number, a character and a string :
integer = 12
real number = 2.500000
character = a
string = yes
*/
#include <stdio.h>
int main(void)
{
int number;
printf("Enter a hexadecimal number or anything else to quit:\n");
while (scanf("%x",&number))
{
printf("Hexadecimal Number = %x\n",number);
printf("Decimal Number = %d\n",number);
}
}
/*************** If input is: 0x231 0xf5e 0x1 q, ****************
**************** then output should be similar to: **************
Enter a hexadecimal number or anything else to quit:
Hexadecimal Number = 231
Decimal Number = 561
Hexadecimal Number = f5e
Decimal Number = 3934
Hexadecimal Number = 1
Decimal Number = 1
*/
stdin und ordnet Daten mithilfe der alternativen positionsgebundenen Formatzeichenfolge zu.#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
char s[20];
float f;
scanf("%2$s %3$f %1$d",&i, s, &f);
printf("The data read was \n%i\n%s\n%f\n,i,s,f);
return 0;
}
/*************** If the input is : test 0.2 100 *****************
************** then the output will be similar to: ***************
The data read was
100
test
0.20000
*/
--------------------------------------------------------------------
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
void main(void)
{
wchar_t uString[20];
setlocale(LC_UNI_ALL, "");
scanf("Enter a string %ls",uString);
printf("String read was %ls\n",uString);
}
/* if the input is : ABC
then the output will be similiar to:
String read was ABC
*/
Zugehörige Informationen
- fscanf ()-Formatierte Daten Lesen
- printf ()-Formatierte Zeichen Drucken
- sscanf ()-Daten Lesen
- strtod ()-strtof ()-strtold ()-Zeichenfolge in Double, Float und Long Double konvertieren
- strtod32()- strtod64()- strtod128()-Zeichenfolge in dezimale Gleitkommazahl konvertieren
- wscanf ()-Daten Mit Zeichenfolge Im Breitformat Lesen
- fwscanf ()-Daten mit Breitzeichen aus Datenstrom lesen
- swscanf ()-Daten Mit Breitzeichen Lesen
- <stdio.h>
