13.14 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;
}
Es wird angenommen, dass folgende Eingabe vorgenommen wurde:
Programmieren in C macht Spass
Folgende Ausgabe bekommen Sie dabei auf dem Bildschirm zu sehen:
Hier klicken, um das Bild zu Vergrößern
Abbildung 13.13
Probleme beim Einlesen von Strings mit scanf
Wo sind die restlichen Zeichen? Das Problem liegt hier bei der Funktion scanf(). 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 später 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 so genannten Pufferüberläufe (Buffer Overflow) 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 14, Zeiger (Pointer), werden Sie noch mehr über Strings erfahren.
|