Kapitel 5 Formatierte Eingabe mit scanf()
Jetzt können Sie zwar schon Stringkonstanten auf dem Bildschirm ausgeben, aber es fehlt doch noch etwas zur Eingabe (Input), um mehr aus den Programmen zu machen. Also auf zum Input-Befehl namens scanf(), dem Gegenstück zu printf().
Hinweis Zuerst noch ein Hinweis für die absoluten Anfänger in der Programmiersprache C. Einiges wird Ihnen in diesem Kapitel ein wenig unklar sein. Aber wenn Sie das Buch ganz durchgelesen haben, wird sich so einiges von selber klären. Sie werden Erleuchtung finden, versprochen!
|
Zunächst die Syntax der Funktion:
#include <stdio.h> //benötigter include für diesen Befehl
int scanf(const char *format, ...);
Mit der Funktion scanf() können Werte unterschiedlicher Datentypen formatiert eingelesen werden. Eingelesen wird dabei von der Standardeingabe (stdin). Mit Standardeingabe ist normalerweise die Tastatur gemeint. Hierzu ein Beispiel mit der Funktion scanf():
/* scanf1.c */
#include <stdio.h>
int main (void) {
int i; /* Ein ganzzahliger Datentyp */
printf("Bitte geben Sie eine Zahl ein : ");
scanf("%d",&i); /* Wartet auf die Eingabe */
printf("Die Zahl, die Sie eingegeben haben, war %d\n",i);
return 0;
}
Wenn das Programm korrekt abläuft, wird nach einer Zahl gefragt. Jetzt gibt der Anwender eine Zahl ein und drückt (¢). Anschließend gibt das Programm die Zahl, die eingegeben wurde, auf dem Bildschirm aus und wird beendet.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 5.1
Eine einfache Zahleneingabe mit scanf()
Bildlich können Sie sich diesen Vorgang folgendermaßen vorstellen:
 Hier klicken, um das Bild zu Vergrößern
Abbildung 5.2
Programm-Ein-/Ausgabe mit scanf() und printf()
scanf() ist ähnlich aufgebaut wie printf(). Wie bei printf() werden hier zwei Klammern und zwei Hochkommata verwendet. Es wird also formatiert eingelesen. Das Formatzeichen %d steht für die formatierte Eingabe einer dezimalen Zahl. Was aber bedeutet hier das Zeichen »&«?
5.1 Der Adressoperator »&«
 
Den Adressoperator »&« jetzt schon besser zu verstehen, kann nicht schaden. Später, wenn das Thema der Pointer (Zeiger) (Kapitel 14) besprochen wird, kann dieses Vorverständnis von Nutzen sein. Sollte Sie dieser Abschnitt ein wenig fremd anmuten, ist das kein Grund zur Sorge.
Eine Variable kann in die vier folgenden Einzelteile zerlegt werden:
|
Datentyp |
|
Name der Variablen |
|
Speicheradresse der Variablen |
|
Der Wert der Variablen |
Im Programmbeispiel oben heißt das konkret, der Datentyp ist int, der Name ist i, die Adresse wird während der Laufzeit zugewiesen, darauf haben Sie keinen Einfluss. Die Speicheradresse sei hier z.B. 0000:123A. Der Wert ist der, den Sie mit scanf() noch eingeben mussten. Wurde jetzt z.B. 5 eingegeben, ist dieser Speicherplatz wie folgt belegt:
 Hier klicken, um das Bild zu Vergrößern
Abbildung 5.3
Eine Variable im Speicher
Das &-Zeichen ist nichts anderes als der Adressoperator. Dies bedeutet hier, der Variablen i vom Typ int mit der Speicheradresse 0000:123A wird der Wert 5 zugewiesen. Oder einfacher: Verschicken Sie eine E-Mail an jemanden, ohne die E-Mail-Adresse anzugeben?!
Achtung Ein häufiger Fehler, den Anfänger machen, ist das Weglassen des Adressoperators &.
|
Was beim Einlesen eines Strings (Zeichenkette) richtig ist, ist bei anderen Datentypen wie Ganz- oder Gleitpunktzahlen wieder falsch:
/* FALSCH, da Adressoperator & fehlt */
scanf("%d",zahl);
/* Richtig, eine Zeichenkette benötigt keinen Adressoperator */
scanf("%s",string);
Auch wenn scanf() das Gegenstück zu printf() ist und sich beide in ihrer Schreibweise ähneln, sollten Sie nicht auf die Idee kommen, Folgendes zu schreiben:
/* FALSCH */
scanf("Bitte geben Sie eine Zahl ein: %d\n",&zahl);
Das funktioniert deshalb nicht, weil scanf() für die Standardeingabe programmiert ist und printf() für die Standardausgabe. Wobei die Standardausgabe auf der Kommandozeile auch umgeleitet werden kann. Aber dazu später mehr.
|