C für Dummies. Dan Gookin
Чтение книги онлайн.
Читать онлайн книгу C für Dummies - Dan Gookin страница 36
Sichere Dateneingaben
Was jetzt? Müssen wir deshalb aufhören, die Sprache C zu benutzen? Nein, Sie müssen einfach nur damit aufhören, Funktionen wie scanf
zu verwenden. Es gibt eine sichere Alternative dazu: den großen Bruder fgets
. Da ist auch das f
wieder. Schauen Sie sich zunächst das Programm InsultSicher.c
an.
#include <stdio.h>
int main()
{
char idiot[20];
printf("Name eines Idioten: ");
fgets(idiot, 20, stdin);
printf("Yep, ich denke auch, dass %s ein Idiot ist.\n", idiot);
return 0;
}
Listing 3.8: Name: InsultSicher.c
Es fällt sofort auf, dass fgets
als zweiten Parameter die Zahl 20
verwendet. Die kennen wir schon – es ist die Maximallänge von unserem String idiot
mitsamt diesem famosen Nullbyte. Damit verhindert fgets
, dass mehr Zeichen eingelesen werden können, als Platz vorhanden ist, und Speicherüberläufe wie bei scanf
sind damit ausgeschlossen.
Die Funktion fgets
Die Funktion fgets
liest über die Tastatur eingegebene Zeichen ein und speichert diese in einer Stringvariablen, die bereits zuvor über das Schlüsselwort char
erzeugt worden sein muss. Die Funktion hört mit dem Lesen von Zeichen auf, sobald die
length
Zeichen in den String gelesen. War der String kürzer als length
und wurde die -Taste gedrückt, so ist das Zeichen \n
ebenfalls im String enthalten.
Der String wird von einem Nullbyte beendet.
fgets(var, length, stdin);
fgets
folgt ein Paar runde Klammern, dahinter ein Semikolon, dazwischen der Name einer Stringvariablen, die Anzahl der Zeichen, die Sie lesen wollen – und eine Variable mit dem Namen stdin
.
stdin
heißt Standard Input und bezeichnet den Zeichenstrom, der von der Tastatur in das Programm fließt (sehr poetisch).
Die fgets
-Funktion ist eine vollständige Anweisung in C. Sie endet daher auch immer mit einem Semikolon.
Verwenden Sie für die Arbeit mit Zeichenketten immer nur Funktionen, bei denen die Länge des Strings angegeben werden kann, denn so kann die Funktion prüfen, dass nicht über das Ziel hinausgeschrieben wird. Im Klartext: Wir verwenden
scanf
ab jetzt nie mehr. Ich habe es erwähnt, weil Sie es in vielen Lehrbüchern (noch) finden.
Der dritte Parameter von fgets
heißt stdin
und bezeichnet die Standardeingabe (st
and
ard in
put). Damit ist die Tastatur gemeint. Bei scanf
kann man sich diese Angabe sparen, weil diese Funktionen immer automatisch stdin
benutzen. Lassen Sie sich davon zunächst nicht weiter beeindrucken.
Es gibt da noch eine kleine Unschönheit mit fgets
: Diese Funktion liest nämlich netterweise gleich noch die
fgets
gelesenen Strings findet man daher im Regelfall noch ein \n
. Das ist ein wichtiger Unterschied zu scanf
. Damit müssen wir zunächst einfach leben, ich komme in Kapitel 10 darauf zurück.
put – put – putputput – puts
Im Grunde ist puts
eine vereinfachte Version der Funktion printf
. puts
gibt Texte am Bildschirm aus, aber ohne die ganzen Formatierungszaubereien von printf
. puts
ist einfach die schlichte Variante von »Ja, ich gebe Text aus«. Im Kasten »Die Funktion puts (Text ausgeben)« erfahren Sie etwas über den Aufbau.
Ein großer Unterschied:
puts
fügt am Ende des Strings immer automatisch eine neue Zeile ein, es wird also immer ein \n
ausgegeben, auch wenn Sie es nicht schreiben. Dies lässt sich nicht umgehen.
puts
kann auch verwendet werden, um eine Stringvariable auszugeben. In diesem Fall steht statt der Stringkonstanten in Anführungszeichen einfach der Name der Stringvariablen an dieser Stelle.
Die Funktion puts (Text ausgeben)
Die Funktion puts
gibt Text auf dem Bildschirm aus – eine limitierte Version von printf
ohne die Formatierungsanweisungen:
puts("
text
");
puts
folgt ein Paar runde Klammern, dazwischen steht der auszugebende text
in Anführungszeichen, den Klammern folgt wieder unser Semikolon, da auch puts
eine Anweisung ist.
Noch eine doofe Spielerei
Damit Sie sehen, wie puts
arbeitet, schreiben wir das Programm Stop.c
. Ja, es ist ziemlich doof, aber Verzeihung, Sie lernen hier ja noch.
#include <stdio.h>
int main()
{
puts("Kann nicht aufhoeren, der Ausschalter klemmt!");
return 0;
}
Listing 3.9: Name: Stop.c
Eingeben, kompilieren, linken, starten. Das Programm erzeugt die folgende Ausgabe:
Kann nicht aufhoeren, der Ausschalter klemmt!
Sie müssen am Ende des Strings kein \n
für eine neue Zeile einfügen, puts
macht das immer automatisch (wenn Sie das nicht wollen, müssen Sie printf
bemühen).
Genau wie printf
bringt puts
eine Ausgabe auf den Bildschirm. Der Text wird von Anführungszeichen umschlossen und dann von runden Klammern umzingelt.
Genau wie bei printf
muss man \"
verwenden, wenn man im String irgendwo ein einfaches Anführungszeichen "
einsetzen will. Für die anderen Zeichen nach einem \
gilt das übrigens auch.
Kümmern Sie sich nicht um die %
-Zeichen,