C 5: scanf() – Formatiert einlesen
Zu Anfang ein Listing, welches später erklärt werden soll:
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main() { int i; printf("Zahl eingeben: "); scanf("%d", &i); printf("Die Zahl war: %d\n", i); return 0; } |
Drei Zeilen sind besonders wichtig: Nummer 4, 7 und 8. Zeile 4 definiert eine neue Variable vom Typ Integer (Ganzzahl). In Zeile 7 wird scanf()
benutzt um einen Wert von der Standardeingabe in eine Variable zu lesen. Ganz konkret handelt es sich um eine Funktion, die als erstes ein Formatzeichen als Argument bekommt – in diesem Fall %d
in Anführunszeichen. (Merke: Formatzeichen stehen immer in Anführungszeichen!) Solche Formatzeichen werden in der Ein- und Ausgabe verwendet um dem Compiler zu signalisieren um welchen Datentypen es sich handelt. Datentypen werden in C nämlich strikt getrennt. Ein String „test“ darf also nicht in einen Integer-Datentyp gespeichert werden. Hier ist eine Übersicht der üblichsten Formatzeichen in C:
Zeichen | Bedeutung |
%d oder %i |
Dezimalzahl |
%o |
Oktalzahl |
%X oder %x |
groß bzw. klein geschriebene Hexadezimalzahl |
%f |
Gleitpunktzahl (Kommazahl) |
%c |
einzelnes Zeichen |
%s |
Zeichenkette, String |
In diesem Fall wird also eine einfache Integer-Zahl eingelesen. Dieser Wert wird dann in die Variable i
geschrieben. (Das &
sorgt eigentlich dafür, dass der Wert in die Adresse, welche i
besitzt, geschrieben wird, aber das kommt später noch genauer.) Wichtig ist, anzumerken, dass dieses Vorgehen nicht mit Zeichenketten funktioniert – aber allen anderen elemtaren Datentypen.
Wird der Code kompiliert, passiert folgendes:
tcr@triton ~ $ gcc scanf.c tcr@triton ~ $ ./a.out Zahl eingeben: 7 Die Zahl war: 7 tcr@triton ~ $ |
Ändert man nur ein Zeichen, nämlich printf("Die Zahl war: %d\n", i);
zu printf("Die Zahl war: %X\n", i);
, wird ein Integerwert als Dezimalzahl eingegeben und als Hexadezimalzahl ausgegeben (testet es und überprüft das Ergebnis mit einem Desktop-Taschenrechner!).
Das war im Grunde schon scanf()
. Es gibt natürlich noch viel mehr zu schreiben, aber gerade für Einsteiger wirken zu viele Informationen zu verwirrend. An dieser Stelle kommt auch mein Rat an euch: man muss nicht alles verstehen. Man muss es nur einmal gesehen haben. Gerade bei C wirkt am Anfang vieles etwas verwirrend, was aber mit mehr Erfahrung einen Sinn ergibt.
PS: Zwei Zahlen nebeneinander können mit scanf("%d %d", &a, &b);
eingelesen werden.
PPS: Bei mehreren scanf
s nacheinander, sollte man am besten fflush(stdin)
verwenden da sonst einfach gesagt das Zeichen \n
im Eingabebuffer „hängen bleibt“.