C für Dummies. Dan Gookin
Чтение книги онлайн.

Читать онлайн книгу C für Dummies - Dan Gookin страница 36

Название: C für Dummies

Автор: Dan Gookin

Издательство: John Wiley & Sons Limited

Жанр: Программы

Серия:

isbn: 9783527833382

isbn:

СКАЧАТЬ hiermit sogar, Maschinencode in den Speicher zu schmuggeln, der dann ausgeführt wird. Auf diese Weise kann man den Computer fernsteuern oder eigene Programme starten.

       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 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

-Taste gedrückt wird. Es werden nur maximal 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 (standard input). 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

-Taste mit. Am Ende eines mit 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.