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!
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!