Parameter | const char *format Die Formatzeichenkette kann drei Klassen von Zeichen bzw. Angaben enthalten: Zwischenraumzeichen Beliebige Zeichen, außer Zwischenraum- und dem Prozentzeichen (%) Formatanweisungen, beginnend mit dem Prozentzeichen (%)
'BLANK' | Leerzeichen | \n | Zeilenvorschub | \t | Tabulator |
'BLANK' | Leerzeichen | \n | Zeilenvorschub | \t | Tabulator | \f | Seitenwechsel | \v | vertikaler Tabulator | \r | Wagenrücklauf |
Die Formatzeichenkette kann beliebig viele oder keine Zwischenraumzeichen enthalten. Diese Zeichen haben keine Steuerfunktion. Irgendwelche Zwischenraumzeichen in der Eingabe werden als Trennzeichen zwischen Eingabefeldern behandelt und nicht mit umgewandelt (Ausnahme siehe %c und %[ ]). Das Zeichen muss mit dem nächsten Zeichen aus der Eingabe übereinstimmen. scanf liest das Eingabezeichen, jedoch ohne es umzuwandeln und in einer Variablen abzuspeichern. Stimmt das Eingabezeichen nicht mit dem hier angegebenen Zeichen überein, wird die Eingabebearbeitung abgebrochen. argumentenliste Zeiger auf Variablen, in die scanf die umgewandelten Ergebnisse abspeichern soll. Für %*-Anweisungen (Zuweisung überspringen) in format dürfen keine Zeigerargumente angegeben werden. Für alle anderen %-Anweisungen muss es jeweils ein Zeigerargument geben. Der Datentyp des Zeigerargumentes richtet sich nach der Typangabe in der zugehörigen Formatanweisung. Im Folgenden wird die Formatanweisung getrennt nach KR-Funktionalität und ANSI-Funktionalität beschrieben. Formatanweisungen enthalten Angaben, wie die Eingabefelder zu interpretieren und umzuwandeln sind. Sie können folgendermaßen aufgebaut sein:
% [*][n]{ [{l | h} {d | o | x} |
[l] {e | f} |
{D | O | E | F} |
{c | s}
{[...] | [^...]} |
% }
Zu einer Formatanweisung gehört ein Eingabefeld. Ein Eingabefeld ist eine Folge von Zeichen, die beendet wird durch das erste Zwischenraumzeichen, durch ein Zeichen, das nicht zur Formatanweisung (Typangabe) passt, wenn die explizit angegebene Feldlänge n erreicht ist.
Führende Zwischenraumzeichen werden bei der Eingabe ignoriert. Jede Formatanweisung muss mit einem Prozentzeichen (%) beginnen. Die restlichen Zeichen werden wie folgt interpretiert: * | Überspringen einer Zuweisung. Das nächste Eingabefeld wird zwar gelesen und umgewandelt, aber in keiner Variablen abgespeichert. | n | Maximale Länge des umzuwandelnden Eingabefeldes. Tritt vorher ein Zwischenraumzeichen oder ein Zeichen auf, das nicht zur Typangabe in der Formatanweisung passt, wird die Länge entsprechend gekürzt. | l | l vor d, o, x: Umwandlung eines Arguments vom Typ Zeiger auf long int (d) bzw. unsigned long int (o, x). Die Angabe ist identisch mit den Großbuchstaben D, O, X. l vor e, f: Umwandlung eines Arguments vom Typ Zeiger auf double . Die Angabe ist identisch mit den Großbuchstaben E, F. | h | h vor d, o, x: Umwandlung eines Arguments vom Typ Zeiger auf short int (d) bzw. unsigned short int (o, x). | d | Ein dezimaler Integerwert wird erwartet. Das entsprechende Argument muss ein Zeiger auf int sein. | o | Ein oktaler Integerwert wird erwartet. Das entsprechende Argument kann ein Zeiger auf unsigned int oder int sein. Intern wird der Wert unsigned dargestellt. | x | Ein sedezimaler Integerwert wird erwartet. Das entsprechende Argument kann ein Zeiger auf unsigned int oder int sein. Intern wird der Wert unsigned dargestellt. | e, f | Eine Gleitkommazahl wird erwartet. Das entsprechende Argument muss ein Zeiger auf float sein. Die Gleitkommazahl kann ein Vorzeichen enthalten sowie einen Exponenten (E bzw. e, gefolgt von einem ganzahligen Wert). Das Dezimalpunktzeichen wird durch die Lokalität (Kategorie LC_NUMERIC) beeinflusst. Voreingestellt ist der Punkt. | c | Ein Zeichen wird erwartet. Das entsprechende Argument sollte ein Zeiger auf character sein. scanf liest in diesem Fall auch Leerzeichen ein. Um das nächste Zeichen ungleich Leerzeichen einzulesen, ist "%1s" zu verwenden. c eignet sich dazu, Zeichenketten einzulesen, die auch Leerzeichen enthalten: Dazu ist als Argument ein Zeiger auf einen char -Vektor zu übergeben und eine Feldlänge n anzugeben (z.B. "%10c"). scanf schließt in diesem Fall die Zeichenkette nicht automatisch mit dem Nullbyte ab. | s | Eine Zeichenkette wird erwartet. Das entsprechende Argument muss ein Zeiger auf einen char -Vektor sein und groß genug, um die Zeichenkette und ein abschließendes Nullbyte (\0) aufnehmen zu können. scanf schließt die Zeichenkette automatisch mit dem Nullbyte ab. Führende Zwischenraumzeichen in der Eingabe werden ignoriert, ein nachfolgendes Zwischenraumzeichen wird als Trennzeichen (Ende der Zeichenkette) interpretiert. | [ ] | Eine Zeichenkette wird erwartet. Das entsprechende Argument muss ein Zeiger auf einen char -Vektor sein und groß genug, um die Zeichenkette inklusive des automatisch angefügten Nullbytes aufnehmen zu können. Im Unterschied zu %s fungieren bei dieser Angabe Leerzeichen nicht automatisch als Trennzeichen. [...] | Bei dieser Angabe werden solange Zeichen eingelesen, bis das erste Zeichen auftritt, das nicht in den eckigen Klammern angegeben ist. D.h., die Zeichenkette darf nur aus den Zeichen in [ ] bestehen, alle anderen Zeichen gelten als Trennzeichen. | [^...] | Bei dieser Angabe werden solange Zeichen eingelesen, bis eines von den Zeichen auftritt, die in den eckigen Klammern nach ^ angegeben sind. Nur die in [ ] angegebenen Zeichen gelten als Trennzeichen. |
| % | Eingabe des Zeichens %, keine Umwandlung. | Formatanweisungen enthalten Angaben, wie die Eingabefelder zu interpretieren und umzuwandeln sind. Sie können folgendermaßen aufgebaut sein:
% [*][n]{ [h | hh | l | ll| j | z | t] {d | i | o | u | x | X} |
[h | hh | l | ll| j | z | t] n |
[l | L] {a | A | e | E | f | F | g | G} |
p |
[l] { [...] | [^...] | c | s} |
% }
Zu einer Formatanweisung gehört ein Eingabefeld. Ein Eingabefeld ist eine Folge von Zeichen, die beendet wird durch das erste Zwischenraumzeichen, durch ein Zeichen, das nicht zur Formatanweisung (Typangabe) passt, wenn die explizit angegebene Feldlänge n erreicht ist.
Führende Zwischenraumzeichen werden bei der Eingabe ignoriert. Jede Formatanweisung muss mit einem Prozentzeichen (%) beginnen. Die restlichen Zeichen werden wie folgt interpretiert: * | Überspringen einer Zuweisung. Das nächste Eingabefeld wird zwar gelesen und umgewandelt, aber in keiner Variablen abgespeichert. | n | Maximale Länge des umzuwandelnden Eingabefeldes. Tritt vorher ein Zwischenraumzeichen oder ein Zeichen auf, das nicht zur Typangabe in der Formatanweisung passt, wird die Länge entsprechend gekürzt. | l | l vor d, i, o, u, x, X: Umwandlung eines Arguments vom Typ Zeiger auf long int (d, i) bzw. unsigned long int (o, u, x, X). l vor a, A, e, E, f, F, g, G: Umwandlung eines Arguments vom Typ Zeiger auf double . l vor c, s, oder [ : Umwandlung eines Arguments vom Typ Zeiger auf wchar_t . l vor n: Das Argument ist vom Typ Zeiger auf long int (keine Umwandlung). | ll | ll vor d, i, o, u, x, X: Umwandlung eines Arguments vom Typ Zeiger auf long long int (d, i) bzw. unsigned long long int (o, u, x, X). ll vor n: Das Argument ist vom Typ Zeiger auf long long int (keine Umwandlung). | hh | hh vor d, i, o, u, x, X: Umwandlung eines Arguments vom Typ Zeiger auf signed char (d, i) bzw. unsigned char (o, u, x, X). hh vor n: Das Argument ist vom Typ Zeiger auf signed char (keine Umwandlung). | h | h vor d, i, o, u, x, X: Umwandlung eines Arguments vom Typ Zeiger auf short int (d, i) bzw. unsigned short int (o, u, x, X). h vor n: Das Argument ist vom Typ Zeiger auf short int (keine Umwandlung). | j | j vor d, i, o, u, x, X: Umwandlung eines Arguments vom Typ Zeiger auf intmax_t (d , i ) bzw. uintmax_t (o , u , x , X ). j vor n: Das Argument ist vom Typ Zeiger auf intmax_t (keine Umwandlung). | z | z vor d, i, o, u, x, X: Umwandlung eines Arguments vom Typ Zeiger auf signed long int (d , i ) bzw. size_t (o , u , x , X ). z vor n : Das Argument ist vom Typ Zeiger auf signed long int (keine Umwandlung). | t | t vor d, i, o, u, x, X: Umwandlung eines Arguments vom Typ Zeiger auf ptrdiff_t (d , i ) bzw. unsigned long int (o , u , x , X ). t vor n: Das Argument ist vom Typ Zeiger auf ptrdiff_t (keine Umwandlung). | L | L vor a, A, e, E, f, F, g, G: Umwandlung eines Arguments vom Typ Zeiger auf long double . | d | Ein dezimaler Integerwert wird erwartet. Das entsprechende Argument muss ein Zeiger auf int sein. | i | Ein Integerwert wird erwartet. Die Basis (sedezimal, oktal, dezimal) wird aus dem Aufbau des Eingabefeldes ermittelt. Führendes 0x oder 0X: sedezimal Führende 0: oktal Sonst: dezimal Das entsprechende Argument muss ein Zeiger auf int sein. | o | Ein oktaler Integerwert wird erwartet. Das entsprechende Argument kann ein Zeiger auf unsigned int oder int sein. Intern wird der Wert unsigned dargestellt. | u | Ein dezimaler Integerwert wird erwartet. Das entsprechende Argument muss ein Zeiger auf unsigned int sein. | x, X | Ein sedezimaler Integerwert wird erwartet. Das entsprechende Argument kann ein Zeiger auf unsigned int oder int sein. Intern wird der Wert unsigned dargestellt. | a, A, e, E, f, F, g, G |
| Eine Gleitkommazahl wird erwartet. Das erwartete Format ist dasselbe, das auch von den strtod() -Funktionen erwartet wird. Das entsprechende Argument muss ein Zeiger auf float sein. Das Dezimalpunktzeichen wird durch die Lokalität (Kategorie LC_NUMERIC) beeinflusst. Voreingestellt ist der Punkt. | c | Ohne Umwandlungszeichen l : Ein Zeichen wird erwartet. Das entsprechende Argument sollte ein Zeiger auf character sein. scanf liest in diesem Fall auch Leerzeichen ein. Um das nächste Zeichen ungleich Leerzeichen einzulesen, ist "%1s" zu verwenden. c eignet sich dazu, Zeichenketten einzulesen, die auch Leerzeichen enthalten: Dazu ist als Argument ein Zeiger auf einen char -Vektor zu übergeben und eine Feldlänge n anzugeben (z.B. "%10c"). scanf schließt in diesem Fall die Zeichenkette nicht automatisch mit dem Nullbyte ab. Mit Umwandlungszeichen l : Es wird eine Multibyte-Zeichenkette erwartet, die im „initial shift“-Zustand beginnt. Die Multibyte-Zeichen werden in Langzeichen konvertiert (wie durch mbrtowc ; das zugehörige mbstate_t -Objekt wird vor Konvertierung des ersten Multibyte-Zeichens mit Null initialisiert). Das entsprechende Argument muss ein Zeiger auf das erste Element eines Feldes vom Typ wchar_t sein, das groß genug ist, um die resultierende Folge aufzunehmen. Es wird kein abschließendes Null-Langzeichen angefügt. | p | Ein 8stelliger Zeigerwert wird erwartet, analog dem Format %08.8x. Das entsprechende Argument muss vom Typ Zeiger auf einen Zeiger auf void sein. | s | Ohne Umwandlungszeichen l : Eine Zeichenkette wird erwartet. Das entsprechende Argument muss ein Zeiger auf einen char -Vektor sein und groß genug, um die Zeichenkette und ein abschließendes Nullbyte (\0) aufnehmen zu können. scanf schließt die Zeichenkette automatisch mit dem Nullbyte ab. Führende Zwischenraumzeichen in der Eingabe werden ignoriert, ein nachfolgendes Zwischenraumzeichen wird als Trennzeichen (Ende der Zeichenkette) interpretiert. Mit Umwandlungszeichen l : Es wird eine Multibyte-Zeichenkette erwartet, die im „initial shift“-Zustand beginnt. Die Multibyte-Zeichen werden in Langzeichen konvertiert (wie durch mbrtowc ; das zugehörige mbstate_t -Objekt wird vor Konvertierung des ersten Multibyte-Zeichens mit Null initialisiert). Das entsprechende Argument muss ein Zeiger auf einen wchar_t -Vektor sein und groß genug, um die resultierende Langzeichenkette und ein abschließendes Null-Langzeichen aufnehmen zu können: scanf schließt die Langzeichenkette automatisch mit dem Null-Langzeichen ab. Führende Zwischenraumzeichen in der Eingabe werden ignoriert, ein nachfolgendes Zwischenraumzeichen wird als Trennzeichen (Ende der Langzeichenkette) interpretiert. | [ ] | Ohne Umwandlungszeichen l : Eine Zeichenkette wird erwartet. Das entsprechende Argument muss ein Zeiger auf einen char -Vektor sein und groß genug, um die Zeichenkette inklusive des automatisch angefügten Nullbytes aufnehmen zu können. Im Unterschied zu %s fungieren bei dieser Angabe Leerzeichen nicht automatisch als Trennzeichen. Mit Umwandlungszeichen l : Es wird eine Multibyte-Zeichenkette erwartet, die im „initial shift“-Zustand beginnt. Die Multibyte-Zeichen werden in Langzeichen konvertiert (wie durch mbrtowc ; das zugehörige mbstate_t -Objekt wird vor Konvertierung des ersten Multibyte-Zeichens mit Null initialisiert). Das entsprechende Argument muss ein Zeiger auf einen wchar_t -Vektor sein und groß genug, um die resultierende Langzeichenkette und ein abschließendes Null-Langzeichen aufnehmen zu können: scanf schließt die Langzeichenkette automatisch mit dem Null-Langzeichen ab. [...] | Bei dieser Angabe werden solange Zeichen eingelesen, bis das erste Zeichen auftritt, das nicht in den eckigen Klammern angegeben ist. D.h., die Zeichenkette darf nur aus den Zeichen in [ ] bestehen, alle nicht angegebenen Zeichen gelten als Trennzeichen. Die schließende Klammer ] kann in die Liste der einzulesenden Zeichen aufgenommen werden, wenn sie als erstes Zeichen unmittelbar nach der öffnenden Klammer angegeben wird: [ ]...]. | [^...] | Bei dieser Angabe werden solange Zeichen eingelesen, bis eines von den Zeichen auftritt, die in den eckigen Klammern nach ^ angegeben sind. Nur die in [ ] angegebenen Zeichen gelten als Trennzeichen. Die schließende Klammer ] kann in die Liste der Trennzeichen aufgenommen werden, wenn sie als erstes Zeichen unmittelbar nach dem Zeichen ^ angegeben wird: [^]...]. |
| n | Es werden keine Zeichen vom Eingabefeld gelesen. Das Argument ist vom Typ Zeiger auf int . Dieser ganzzahligen Variablen wird die Anzahl der Zeichen zugewiesen, die scanf bis zu diesem Zeitpunkt verarbeitet hat. | % | Eingabe des Zeichens %, keine Umwandlung. | |
Hinweise | Bei der Umwandlung von Integerwerten in unsigend int (o, u, x, X) wird aus einem Wert mit negativem Vorzeichen das Zweierkomplement gebildet. Z.B. liefert Format %u bei der Eingabe -1 X’FFFFFFFF’. Das Ergebnis eines scanf -Aufrufes sollten Sie immer abfragen, um sicher zu sein, dass kein Fehler passiert ist! Der nächste scanf -Aufruf startet mit dem Lesen unmittelbar nach dem Zeichen, das als letztes vom vorherigen Aufruf verarbeitet wurde. Wenn ein Eingabezeichen nicht dem angegebenen Format entspricht, wird es in den Eingabepuffer zurückgeschrieben. Es muss dort mit getc abgeholt werden, sonst erhält der nächste scanf -Aufruf dasselbe Zeichen noch einmal. Gibt es mehr Zeigerargumente als Formatanweisungen (exkl. den %*-Angaben), werden die überzähligen Argumente ignoriert. Gibt es weniger Argumente, führt dies zu undefinierten Ergebnissen. Bei Textdateien mit der Zugriffsart SAM und variabler Satzlänge, für die zusätzlich eine maximale Satzlänge angegeben ist, gilt: Wenn bei fopen die Angabe split=no gemacht wurde, werden Sätze maximaler Länge beim Lesen nicht mit dem darauffolgenden Satz verkettet. Standardmäßig oder mit der Angabe split=yes wird beim Lesen eines Satzes mit maximaler Satzlänge angenommen, dass es sich bei dem Folgesatz um die Fortsetzung dieses Satzes handelt, und die Sätze werden verkettet. |