C - while Schleife und getchar() macht Aerger

oddateee

Member
Hallo zusammen,

erkennt jemand den Fehler?

Code:
Code:
#include <stdio.h>

int main()
{
    char menu;
              
    while(1)  
    {       
        printf("(S)tart, (E)xit: ");
        menu = getchar();

        if( menu == 'S')
        {
            printf("Hallo Welt\n\n");
        }
        else if( menu == 'E')
        {
            return 0;
        }
        else
        {   
            printf("Falsche Eingabe\n\n");
        }
    }    
}

Ausgabe:
Code:
(S)tart, (E)xit: S
Hallo Welt

(S)tart, (E)xit: Falsche Eingabe

(S)tart, (E)xit:

Gewuenschte Ausgabe:
Code:
(S)tart, (E)xit: S
Hallo Welt

(S)tart, (E)xit:

putchar() wird scheinbar einmal uebersprungen.
Weis vielleicht jemand was dahinter steckt?
 
Du hast noch einen Enter im Eingabepuffer, nachdem Du S eingegeben hast. Der wird im 2. Durchlauf ausgewertet. Du muesstest noch ein weigteres getchar() einbauen, um den Druck auf Enter aus dem Puffer zu entfernen.
 
oder den eingabepuffer flushen.

Ich hab mit C eigentlich nicht gerade viel am Hut, aber ist es nicht so, dass fflush(stdin) nicht klar definiert ist? (und unter FreeBSD nicht funktioniert) Ist schon ein Bisschen her, dass ich mich damit beschäftigt hatte, aber ich glaub damit gab es Probleme.
 
ich sagte nicht "fflush(stdin)" sondern "den eingabepuffer flushen" - ob das jetzt z.b. mit fpurge(3) gemacht wird oder mit ner eigenen funktion hab ich nicht gesagt.

aber du hast recht, "fflush(stdin)" sollte man nicht machen.
 
@oneone:

Stimmt, Du hattest nichts von fflush gesagt -- sorry, aber es war ja auch mehr eine Frage als Kritik. Ich hab mir fpurge(3) mal durchgelesen und es ausprobiert; funktioniert einwandfrei. Gut zu wissen, vielleicht brauch ich es ja irgendwann doch mal...
 
Zuletzt bearbeitet:
hier ist mein Vorschlag, habe es ausprobiert und funktioniert auch:

Code:
int main()
{
    char menu[2];
              
    while(1)  
    {       
        printf("(S)tart, (E)xit: ");
        fscanf(stdin, "%1s", menu);
        
        switch(*menu)
        {
          case 'S':	printf("Hallo Welt\n\n");
          		break;
          		
          case 'E':	exit(0);		//kein break notwendig, da sowieso abgebrochen wird
          
          default:	printf("Falsche Eingabe\n\n");
        }

    }    
}

Also wenn man zum Beispiel zwei große S hintereinander eingibt und Enter drückt läuft die Schleife insgesamt ein weiteres mal nach der Eingabe durch, da danach das Ende im Puffer erreicht ist.
Zu beachten ist, dass fscanf \n nach \0 umwandelt.
Ja also ob das jetzt nun erwünscht ist oder nicht... weiss ich nicht, notfalls kann man sich ja auch eine eigene Funktion definieren die mit den Eingaben aus dem Puffer umgeht.

mfg
xar
 
Zurück
Oben