Problem mit Eingabefunktionen unter C

KronprinzRudolf

Mitglied
Thread Starter
Dabei seit
30.08.2009
Beiträge
21
Reaktionspunkte
0
Bin gerade dabei eine Konsolenanwendung in C (mit XCode 3.1.4) zu schreiben, die Texte nach einer Auswahl von Algorithmen codiert. Leider scheiter ich immer an einem Problem:
Das Programm beginnt mit einer Begrüßung, danach wird der Benutzer aufgefordert eine Option auszuwählen (manuelle Texteingabe, einlesen einer TXT-Datei, abbrechen des Programms)

int main(void)
{
start("CodeX", "1.0", 2009); //meine eigene Begrüßungsprozedur
printf("Drücken Sie <e> um den zu codierenden Text manuell einzugeben"\n);
printf("Drücken Sie <o> um eine Textdatei (*.txt) zu öffnen.\n");
printf("Drücken <a> um das Programm zu beenden.\n\n");

Danach wird das eingegebene Zeichen eingelesen und an die Char-Variable "eingabe" überwiesen. Da auch der Zeilenumbruch '\n' in den Puffer eingelesen wird und die Funktion fflush() zumindest auf meinem Mac nicht funktioniert, hab ich hier drei Alternativen zu scanf() probiert. Nach dem Einlesen wird mittels einer switch-Verzweigung je nach Art des Zeichens zu den entsprechenden Funtionen weitergeleitet:

1. Alternative: do { scanf("%c", &eingabe); } while (getchar() != '\n');

2. Alternative: fgets(puffer, sizeof(puffer), stdin);
sscanf(puffer, "%c", &eingabe);

3. Alternative: while ((c = getchar()) != '\n') { //ähnlich wie die erste...
eingabe = c; // ...Alternative
}

switch (eingabe) {
case 'e' : manuell(); // Funktion für die manuelle Texteingabe
break;
case 'o' : oeffnen(); // Funktion, um eine Textdatei zu öffnen
break;
case 'a' : return EXIT_SUCCESS;
break;
}

Funtioniert so weit, nur bei der 2. Alternative überspringt er die switch-Anweisung...
Danach wird der manuell eingegeben oder geöffnete Text als String bzw. Char-Array gespeichert. Nun wird noch mal gefragt, ob der Text codiert werden soll:

eingabe = eingabe & 0; //um die Variable eingabe auf 0 zu setzen...
// ...ist aber glaube ich unnötig
printf("Wollen Sie den eingegebenen Text wirklich codieren? Zum Bestätigen <y>, zum Abbrechen <n>.\n\n");
do { scanf("%c", &eingabe); } while (getchar() != '\n');
// hier sind wieder die Alternativen möglich!
switch (eingabe) {
case 'y' : printf("Codieren!"); //nur zum Versuchen!
break;
case 'n' : printf("Nicht Codieren!");
break;
default : printf("Nichts ausgewählt\n");
break;
}
return EXIT_SUCCESS;
} //vorläufiges Ende von main()

Und hier tritt das Problem auf, das Programm wartet nach printf() nicht auf eine Eingabe sondern springt gleich zur switch-Verzweigung zum Punkt default! Anscheinend ist im stdin-Puffer noch immer ein Zeichen vorhanden, das dann sofort an eingabe übergeben wird?! Hab wirklich schon alles ausprobiert aber bin jetzt mit meinem Latein am Ende! Wenn es wirklich am Puffer liegt, kennt jemand einen Befehl um in zu leeren (fflush(stdin) geht ja nicht!) Oder hat sonst jemand eine Idee, wie ich das Problem beheben könnte? Bin für jede Hilfe dankbar!
 
Du verwendest fflush() falsch. Lies die manpage.

PS: Verwende bitte Codetags.
 
Aus der Manpage:

If the stream argument is NULL, fflush() flushes all open output streams.

The function fpurge() erases any input or output buffered in the given
stream. For output streams this discards any unwritten output. For
input streams this discards any input read from the underlying object but
not yet obtained via getc(3); this includes any text pushed back via
ungetc(3).
 
Zurück
Oben Unten