Scanf wird übersprungen (C-Programmierung)?
Ich habe ein C-Programm geschrieben, welches einen string einlesen soll, darin nach einem vom User festgelegten Zeichen suchen soll und es durch ein vom User festgelegten Zeichen ersetzt werden soll. Nun ist mein Problem, dass das 2. und 3. scanf, also die abfragen nach dem Zeichen welches gesucht werden soll und durch was es ersetzt werden soll, übersprungen werden. Hier ist der Code:
#include<stdio.h>
#include<string.h>
char str[256];
char ptr;
int i;
char ersetze;
char durch;
int laenge;
int main()
{
system("clear");
printf("\nGeben Sie etwas ein: ");
scanf(" %[\n]s", &str);
ptr = str;
laenge = strlen(str);
printf("\nBuchstabe zu ersetzen: ");
scanf(" %c", &ersetze);
printf("\nErsetze durch: ");
scanf(" %c", &durch);
for(i=0; i<=laenge; i++)
{
if(ptr == ersetze)
{
ptr = durch;
}
ptr++;
}
printf("\n%s\n", str);
}
3 Antworten
Das Problem ist, dass scanf das Enterzeichen im Eingabepuffer lässt welches dann vom nächsten scanf gelesen wird.
darum sollte man nach jedem scanf ein getchar machen um dieses letzte Zeichen aus dem Puffer zu löschen.
Man sollte scanf() eigentlich besser gar nicht verwenden, weil es damit die Gefahr gibt, dass Eingaben reinkommen, die größer sind als der vorbereitete Buffer. Besser mit fscanf() und buffer limit arbeiten.
Dass der scanf() bei Dir sofort vor Lesen der Eingabe zurückgekommen ist, dürfte daran liegen, dass diese nonstandard-Extension "[\n]" zwischen dem "%" und dem "s" (für whitespace-separated string) von Deiner C-Library nicht erkannt wird und damit ein sofortiger Abbruch erfolgt.
Im übrigen solltest Du im Hinterkopf behalten, dass auf Linux die Standardeingabe im Normalfall erstmal "line buffered" läuft. D. h. Du müsstest ggf. mit setbuf() o. ä. auf zeichenweises Einlesen umstellen. Sonst bekommst Du evtl. noch weitere komische Nebeneffekte.
Du solltest in scanf nicht \n schreiben. einfach nur %s wäre richtig. Sofern mein Wissen nicht eingerostet ist.