News Ticker

C 5: scanf() – Formatiert einlesen

In den ersten Artikel ist gezeigt worden, wie man C-Programme erstellt, erfolgreich kompiliert und auch ausführen kann. Eine einfache Ausgabe mittels printf() wurde auch schon aufgezeigt. Das interessanteste beim Erlernen einer neuen Programmiersprache ist In- und Ouput. Erst so kann ein Programm etwas dynamischer ablaufen. scanf() "scant" Daten vom Input-Buffer ein und soll heute etwas genauer erklärt werden.

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 scanfs nacheinander, sollte man am besten fflush(stdin) verwenden da sonst einfach gesagt das Zeichen \n im Eingabebuffer „hängen bleibt“.