Probleme mit gets
-
Ich hab im Rahmen meiner Ausbildung gerade erst mit C angefangen und mußte mich gleich in meinem ersten "größeren" Programm mit einer Notlösung behelfen.
Das Programm soll in eine Datei schreiben, aber vorher eine Sicherheitsabfrage durchführen, wenn die angegebene Datei bereits existiert, ob sie überschrieben werden soll oder ein anderer Dateiname genommen werden soll:
int Auswahl; int DateiNameOK=0; char Dateiname[67]; do { gets(Dateiname); DateiNameOK=1; if (DateiVorhanden(Dateiname) == 1) /*Funktion liefert Wert 1 wenn Datei schon vorhanden*/ { DateiNameOK=0; printf("\nDie Datei existiert schon !"); printf("\nWas wollen Sie tun ?"); printf("\n(1) Datei ueberschreiben"); printf("\n(0) Dateiname aendern\n"); scanf("%d",&Auswahl); getchar(); /*Ohne diese Zeile bricht das Programm bei Eingabe von 0 ab*/ if (Auswahl == 1) { DateiNameOK=1; } } } while (DateiNameOK == 0)
Bevor ich Zeile 16 eingebaut hatte, brach das Programm nach der Auswahl von "Dateiname aendern" ab, da das Programm die erneute Eingabe eines Dateinamens wohl übersprang. Mit Zeile 16 funktioniert das Programm jetzt ohne Fehler, wenn ich
gets(Dateiname);
durch
scanf("%s",Dateiname);
ersetze, funktioniert es auch ohne Zeile 16.
Meine Frage jetzt, hab ich irgendwo Blödsinn gemacht oder sind solche Probleme mit gets normal. Muss man mit gets irgendetwas speziell beachten, was bei scanf nicht nötig ist.
-
gets sollte man eigentlich gar nicht verwenden, da es nicht die Länge des Eingabebuffers überprüft und es so zu einem Bufferoverflow kommen kann!
Ansonsten ist das getchar hier notwendig, da im Tastaturbuffer das abschließende \n übrig bleibt und der nächste Aufruf einer Funktion zum Einlesen das \n liest (und dann entsprechend die Eingabe abbricht.
-
statt gets kann man fgets() auf stdin anwenden.