Dem Formatstring folgt ein Komma, danach der Name der Variablen. Auf diese Weise sagt man scanf
, wo der Text abgelegt werden soll.
Auch die scanf
-Funktion ist eine Anweisung in C, daher wird auch sie mit einem Semikolon abgeschlossen.
Als Beispiel wollen wir den Vornamen von jemandem einlesen; zuerst brauchen wir also Speicherplatz für den Namen:
char vorname[21];
Diese C-Anweisung stellt Speicher für einen Textstring bereit – so wie man einen Tresor für eine große Summe Geld bereitstellt. Und genau wie der Tresor ist auch die Variable »leer«, wenn man sie erstellt. Es ist nichts darin enthalten. Es können bis zu 20 Zeichen in der Variablen gespeichert werden, was durch die 21
in eckigen Klammern angegeben wird.
20? 21? Was denn nun? In Kapitel 10über Strings werden Sie das genauer erfahren, C hat die Angewohnheit, am Ende eines Strings ein sogenanntes Nullbyte (ein \0x
) zu speichern. Damit merkt C, wann der String zu Ende ist – vergleichbar einem Stoppschild. Für 20 Zeichen brauchen wir also 21 Zeichen.
Der nächste Schritt ist, die Funktion scanf
später im Programm zu benutzen, um Text einzulesen. Etwas wie die folgende Zeile würde funktionieren:
scanf("%s", vorname);
Und so sieht das aus Sicht von scanf
aus: »Okay, ich soll gemäß %s
einen String von der Tastatur einlesen. Und den ganzen Text speichere ich in der Stringvariablen mit dem Namen vorname
. Heiße Sache. Wenn der Benutzer jetzt noch was eintippt, könnte ich meinen Job auch erledigen.«
Abbildung 3.1verdeutlicht das Konzept, das ich hier gerade beschrieben habe.
Abbildung 3.1: Die Anatomie von Stringvariablen und scanf
Wenn Sie ein C-Programm schreiben, das Eingaben benötigt, müssen Sie einen Platz bereitstellen, um die Eingaben abzulegen. Für Texteingaben nimmt man eine Stringvariable, die mithilfe des Schlüsselworts char erstellt wird. (Schauen Sie in das Programm am Ende des Kapitels, wenn Sie ein Beispiel hierzu suchen.)
Benutzt man in einem C-Programm Variablen, so werden diese vor der ersten Benutzung in das Programm geschrieben. Es sind reguläre Anweisungen in C und sie benötigen ein Semikolon am Ende.
Zu Variablen erfahren Sie in Kapitel 4mehr.
scanf funktioniert wie printf, aber es benötigt eine Variable, um den Text abzulegen. Es reicht nicht aus, einfach zu sagen: »Lies mal die Tastatur«, man braucht einen Ort für die Ablage des Textes.
Die Stringvariable ist ein Ort, an dem der eingegebene Text gespeichert wird. Das Schlüsselwort char teilt dem Compiler den Typ der Variablen mit und wie viel Speicherplatz benötigt wird.
Die Formatierungsanweisungen von scanf sind identisch mit denen von printf. Im Normalfall benutzt man sie meistens zusammen mit printf, denn es gibt bessere Wege, die Tastatur abzufragen als mit scanf. Schauen Sie in Tabelle 3.2 im Abschnitt »Mehr Spaß mit printf« nach, wenn Sie nach einer Liste aller Formatierungsmöglichkeiten suchen.
scanf im scharfen Einsatz
Das folgende Programm Whoru.c
haben Sie sicherlich schon gesehen, es wurde in Kapitel 2vorgestellt. Es benutzt scanf
, um Text von der Tastatur einzulesen, und printf
, um ihn auszugeben. Ein schönes Beispiel für Eingabe und Ausgabe.
#include
int main()
{
char me[21];
printf("Wie heissen Sie? ");
scanf("%s", me);
printf("Hallo %s, nett, Sie kennenzulernen!\n", me);
return 0;
}
Listing 3.5:Name: Whoru.c
Falls Sie das Programm im ersten Kapitel noch nicht ausprobiert haben, tun Sie es jetzt.
Die Anweisung char me[21]; sagt dem C-Compiler, dass er Speicher für 20 eingegebene Zeichen und das Nullbyte bereitstellen muss. Die Stringvariable heißt me.
Die scanf-Funktion liest die Tastatur und speichert den Text in der Variablen me.
Das folgende printf gibt das Ergebnis aus. Achten Sie darauf, wie ähnlich das Format von scanf und printf aussieht:scanf("%s", me);scanf enthält in den Klammern "%s" und me.printf("Hallo %s, nett, Sie kennenzulernen!\n", me);printf enthält in den Klammern "%s" (zusammen mit anderem Text) und me.
Kleine Änderungen an Whoru.c
Um zu zeigen, wie ähnlich printf
und scanf
wirklich sind, nehmen Sie die folgende Änderung in Whoru.c
vor, indem Sie die printf
-Anweisung wie folgt modifizieren:
printf("%s", me);
Dadurch erhalten printf
und scanf
ein nahezu identisches Aussehen. Beide enthalten einen Formatstring mit der Zeichenfolge %s
und beide benutzen die Stringvariable me
als »Argument«.
Speichern Sie das geänderte Programm, kompilieren und starten Sie es. Mit der Fehlerbehebung kennen Sie sich inzwischen gut aus.
Die Ausgabe ist diesmal anders, weil das » Hallo …
« nicht ausgegeben wird. Dennoch zeigt das Beispiel, wie ähnlich sich die beiden Funktionen sind und wie sie jeweils Eingabe und Ausgabe behandeln.
Bisher haben Sie printf
und seine Formatierungsmöglichkeiten nur im Zusammenhang mit Strings kennengelernt, bei denen %s
als Platzhalter steht. Aber %s
kann mehrfach verwendet werden, nicht nur einmal. Und es kann mit mehreren Stringvariablen verwendet werden.
Betrachten Sie das folgende Programm Color.c
, das zwei Stringvariablen name
und color
benutzt. Es fragt nach Ihrem Namen und nach Ihrer Lieblingsfarbe. Das abschließende printf
gibt beide Informationen aus.
#include
int main()
{
char name[21];
char color[21];
printf("Wie heissen Sie? ");
scanf("%s", name);
printf("Was ist Ihre Lieblingsfarbe? ");
scanf("%s", color);
printf("Die Lieblingsfarbe von %s ist %s \n", name, color);
return 0;
}
Listing 3.6:Name: Color.c
Geben Sie das Programm ein und speichern Sie es als Color.c
, kompilieren und starten Sie es. Eine beliebte Fehlerquelle ist auch das Vergessen von Kommas, wie hier in printf
. Eine mögliche Ausgabe sieht so aus:
Wie heissen Sie? Marcus
Was ist Ihre Lieblingsfarbe? Rot
Die Lieblingsfarbe von Marcus ist Rot.
Offensichtlich ist %
ein spezielles Zeichen, genauso wie das Anführungszeichen "
und der Backslash \
. Um in einem String ein Prozentzeichen zu schreiben, müssen Sie es doppelt angeben:
printf("Ein Sparbuch bringt nur lausige 0.1%% Zinsen im Jahr\n");
Diese Anweisung gibt den folgenden Text aus:
Ein Sparbuch bringt nur lausige 0.1% Zinsen im Jahr
Was ist wichtiger: die Reihenfolge der %s
-Dingerchen oder die Reihenfolge der Variablen – der Argumente – in der printf
-Funktion? Geben Sie auf? Also ich werde es Ihnen nicht verraten, das müssen Sie schon selbst herausfinden.
Читать дальше