namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:lib:scanf

scanf()

#include <cstdio>

int scanf (const char *format, ...) 

Formatierte Eingabe von stdin.

Parameter

format Formatzeichenkette
weitere Argumente je nach Platzhalter

Die Formatzeichenkette der scanf()-Familie kann neben gewöhnlichen Zeichen Platzhalter für andere Werte besitzen. Nach einem %-Zeichen folgen optional

  • ein *, das die Zuweisung der Eingabe an ein Argument unterdrückt,
  • eine ganzzahlige Längenangabe für die maximale Anzahl zu lesender Zeichen,
  • ein Längen-Modifizierer wie
    • hh bei Zeichen für Zahl-Eingabe,
    • h bei short int,
    • l bei long und long float (d.h. double!) oder
    • L bei long double,

Der Platzhalter wird zwingend abgeschlossen durch einen Konversionsbuchstaben:

d dezimale Ganzzahl
u vorzeichenlose dezimale Ganzzahl
i Ganzzahl dezimal, oktal (0…) oder hexadezimal (0x…)
o Oktalzahl
x Hexadezimalzahl
e, f, g Fließkommazahl in (float) bzw. (double)
c Zeichen, auch whitespace (eins oder exakt so viele wie in Längenangabe)
s C-Zeichenkette (ein Wort ohne Leerzeichen)
p eine Speicheradresse
n Anzahl bisher gelesener Zeichen (in int*-Argument abzulegen)
% passt auf ein Prozentzeichen
[…] ein "scanset" für eine C-Zeichenkette

Die Zeichen in den eckigen Klammern des "scanset" bilden die Menge zu akzeptierender Zeichen. Dabei können Bereiche durch - angegeben werden. Steht als erstes Zeichen in der eckigen Klammer ein ^, werden die angegebenen Zeichen zurückgewiesen: [A-Z] akzeptiert alle Großbuchstaben, [^0-9] akzeptiert alles außer Ziffern.

Den Platzhaltern wird ein folgendes Argument mit einem passenden Typ zugeordnet.

Achtung: Damit die Argumentvariablen Werte auf der Funktion übernehmen können, müssen sie als Adressen &variable an die Funktion übergeben werden. Vorsicht: C-Zeichenkettenvariablen sind schon Adressen auf das Anfangszeichen.

Ergebnis

Rückgabewert: Anzahl der eingelesenen Variablen. Die Funktion endet mit -1, wenn EOF vor irgendeiner Konversion erreicht wurde. Die Funktion beendet das Einlesen eines Platzhalters vor Erreichen eines whitespace-Zeichens und geht weiter, wenn

  • die angegebene Länge erreicht oder
  • ein mit dem Platzhalter unverträgliches Zeichen erreicht wurde.

Die Funktion bricht ab, wenn

  • das einzulesende Zeichen nicht mit dem entsprechenden normalen Zeichen der Formatzeichenkette übereinstimmt,
  • ein Platzhalter mit dem aktuellen Zeichen der Eingabe nicht bedient werden kann. Die Werte ungelesener Argumentvariablen bleiben unverändert. Passen irgendein Platzhalter und der Argumenttyp (Zeiger!) nicht, ist das Verhalten undefiniert.

Siehe auch

Beispiel

scanf.cpp
#include <cstdio>
 
int main()
{
  using namespace std;
  int i = -1;
  float f = -1;
  double d = -1;
  char str[20] = "nichts eingegeben";
 
  printf("Gib eine Ganzzahl ein: ");
  scanf("%d", &i);
 
  printf("Gib eine gebrochene Zahl ein: ");
  scanf("%f", &f);
 
  printf("Gib noch eine gebrochene Zahl ein: ");
  scanf("%lf", &d);
 
  printf("Gib eine Zeichenkette aus max. 19 Grossbuchstaben ein: ");
  scanf(" %19[A-Z]", str);
     //  ^Leerzeichen verschluckt führende whitespaces   
 
  printf("Eingegeben: %d %f %f %s\n", i, f, d, str);
}
kennen/lib/scanf.txt · Zuletzt geändert: 2019-11-20 16:15 von rrichter