C für Dummies. Dan Gookin
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 4 mehr.
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 2 vorgestellt. Es benutzt scanf
, um Text von der Tastatur einzulesen, und printf
, um ihn auszugeben. Ein schönes Beispiel für Eingabe und Ausgabe.
#include <stdio.h>
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.
Das Wunder von %s
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 <stdio.h>
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
Zeit für Experimente
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.
Um das Dilemma aufzulösen, führen Sie in der Zeile mit dem printf
im Programm Color.c
folgende Änderung durch:
printf("Die Lieblingsfarbe von %s ist %s\n", color, name);
Die Reihenfolge der Variablen ist hier vertauscht, erst color
, dann name
. Starten Sie das Programm, um etwas Derartiges zu sehen:
Die Lieblingsfarbe von Rot ist Marcus
Erkannt? Computer sind doof. Wesentlicher Punkt ist hier also, dass Sie bei mehreren Variablen in der printf
-Funktion auf die Reihenfolge achten müssen. Tja, und das %s
? Es ist halt wirklich nur Platzhalter, mehr nicht.
Wie siehtʼs denn mit dieser Änderung aus:
printf("Die Lieblingsfarbe von %s ist %s\n", name, name);
Die Variable name
gleich zweimal – absolut nicht verboten. printf