Die in diesem Post vorgestellten Funktionen printf() und scanf() sind recht gut fuer den Einstieg geeignet, stellen allerdings keinesfalls das Nonplusultra in dar. Ganz im Gegenteil: Beide Funktionen sind eher als sicherheitskritisch zu betrachten und in der Praxis mit Vorsicht zu genießen (Stichwort: "Format String Exploits")
Die Funktion printf() duerfte aus dem letzten Post bekannt sein. scanf() ist eine Funktion, mit der 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():
Code:
/* scanfl.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;
}
Bild + Download:
Wenn alles korrekt laeuft, wird nach einer Zahl gefragt. Nun wird durch den Anwender eine Zahl eingegeben & mit ENTER bestaetigt. Anschließend gibt das Programm die eingegebene Zahl wieder aus und wird beendet.
Das Formatzeichen %d steht fuer die formatierte Eingabe einer dezimalen Zahl. Doch was bedeutet das Zeichen "&" hier?
Der Adressoperator "&"
Eine Variable kann in die vier folgenden Einzelteile zerlegt werden:
- Datentyp
- Name der Variable
- Speicheradresse der Variable
- Wert der Variable
Im Programmbeispiel von oben heißt das konkret: Der Datentyp ist int, der Name ist i und die Adresse wird waehrend der Laufzeit zugewiesen (darauf hat der Coder keinen Einfluss). Die Speicheradresse sei hier z.B. 0000:123A. Der Wert ist der, den man mit scanf() noch eingeben muss.
Eine Variable im Speicher (vereinfacht dargestellt):
Code:
_____________________________________________________________________________________________
│ │
│ │
│ Datentyp │ Name │ Speicheradresse │ Wert │
│ │
│____________________________________________________________________________________________│
│ │
│ │
│ int │ i │ 0000:123A │ 5 │
│ │
│____________________________________________________________________________________________│
Das &-Zeichen ist nicht anderes als der Adressoperator. Dies bedeutet hier, dass der Variablen i vom Typ int mit der Speicheradresse 0000:123A der Wert 5 zugewiesen wird. Oder einfacher: Verschickt man eine E-Mail an jemanden, ohne die E-Mail Adresse anzugeben?
Achtung: Ein Fehler, den Anfaenger haeufig machen ist das Weglassen des Adressoperators &.
Auch wenn scanf() das Gegenstueck zu printf() ist uns sich beide in ihrer Schreibweise aehneln, sollte man nicht auf die Idee kommen, Folgendes zu schreiben:
Code:
/* FALSCH */
scanf("Bitte geben Sie eine Zahl ein: %d\n", &zahl);
Das funktioniert deshalb nicht, weil scanf() fuer die Standardeingabe und printf() fuer die Standardausgabe programmiert ist, wobei die Standardausgabe auf der Kommandozeile auch umgeleitet werden kann.