Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 5 Formatierte Eingabe mit scanf()
  gp 5.1 Der Adressoperator »&«
  gp 5.2 Probleme und deren Behandlung mit scanf()
    gp 5.2.1 Möglichkeit 1
    gp 5.2.2 Möglichkeit 2
    gp 5.2.3 Möglichkeit 3
  gp 5.3 Format prüfen
  gp 5.4 Zusammenfassung scanf()

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.

Abbildung
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:

Abbildung
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 »&«?


Galileo Computing - Zum Seitenanfang

5.1 Der Adressoperator »&«  toptop

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:

gp  Datentyp
gp  Name der Variablen
gp  Speicheradresse der Variablen
gp  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:

Abbildung
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.

 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de