11.12 Einlesen von Strings
Die Verarbeitung von Strings ist nicht so leicht, wie Sie vielleicht zunächst vermuten würden. Sehen Sie sich zur Veranschaulichung folgendes Programm an:
/* string6.c */ #include <stdio.h> #include <stdlib.h> int main(void) { char string[100]; printf("Geben Sie ein paar Wörter ein: "); scanf("%99s", &string[0]); printf("Ihre Eingabe: %s\n",string); return EXIT_SUCCESS; }
Nehmen wir an, dass folgende Eingabe vorgenommen wurde:
Programmieren in C macht Spass
Folgende Ausgabe bekommen Sie dabei auf dem Bildschirm zu sehen:
Abbildung 11.13 Probleme beim Einlesen von Strings mit »scanf«
Wo sind die restlichen Zeichen? Das Problem wird hier von der Funktion scanf() verursacht. Denn scanf() liest lediglich bis zum ersten Leerzeichen ein. Also wird eine andere Funktion zum (sicheren) Einlesen von Zeichenketten benötigt.
Gut geeignet wäre die Funktion fgets(), die in Abschnitt 16.16 noch genauer erklärt wird. Kurz zur Syntax von fgets():
#include <stdio.h> char *fgets(char *string,int anzahl_zeichen,FILE *stream);
Diese Funktion soll jetzt gegen die Funktion scanf() im Programmbeispiel ausgetauscht werden:
/* string7.c */ #include <stdio.h> #include <stdlib.h> int main(void) { char str[100]; printf("Geben Sie ein paar Wörter ein : "); fgets(str, 100, stdin); printf("Ihre Eingabe: %s\n",str); return EXIT_SUCCESS; }
Bei diesem Beispiel werden mit fgets() vom Stream stdin maximal 100 Zeichen in das char-Array str eingelesen, beginnend mit der Anfangsadresse von str. Der Vorteil von fgets() ist dabei, dass mit dieser Funktion keine gefährlichen sogenannten Pufferüberläufe (Buffer-Overflows) passieren können. Sollten Sie in diesem Beispiel 120 Zeichen eingegeben haben, liest fgets() davon 98 sichtbare Zeichen plus Newline-Zeichen (\n) plus Stringende-Zeichen (\0) ein. fgets() hängt am Ende des Strings immer ein \n-Zeichen an.
Zum Einlesen von Strings noch ein Programmbeispiel:
/* string8.c */ #include <stdio.h> #include <stdlib.h> /*Passwort*/ const char p[]= { "123xyz456" }; int check_passwort(char passw[]) { int i, n = sizeof(p) / sizeof(char); for(i=0; i < n; i++) if(passw[i] != p[i]) return 0; /* Falsches Passwort */ return 1; /* Richtiges Passwort */ } int main(void) { char Name[20], passwort[10]; printf("Login-Name : "); fgets(Name, 20, stdin); printf("Passwort : "); fgets(passwort, 10, stdin); if( check_passwort(passwort) == 1) printf("Willkommen im System %s\n",Name); else printf("Falsches Passwort! Systemzugriff verweigert.\n"); return EXIT_SUCCESS; }
Hier haben Sie ein Programm für eine einfache Passwort-Abfrage, die innerhalb der Funktion check_passwort ausgeführt wird. Die Funktion durchläuft n Zeichen.
Stimmen alle eingegebenen Zeichen überein, gibt die Funktion 1 zurück. Stimmt ein Zeichen nicht überein, beendet sich die Funktion mit dem Rückgabewert 0.
In Kapitel 12, »Zeiger (Pointer)«, werden Sie noch mehr über Strings erfahren.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.