Problem mit Eingabestrom und Einlesen aus der Tastatur



  • Hallo

    ich stehe vor einem Problem in C, das ich nicht ganz verstehe (bzw. die internen Vorgänge nicht nachvollziehen kann).
    Im Folgenden ist ein sinnloser Code, der nur das Problem kenntlich machen soll:

    void sinnlos(){
    	char input[4];  // Zwei Zeichen + '\n' + '\0'
    
    	fgets(input,4,stdin);
    
    	if((input[0]<='8' && input[0]>='1') && (input[1]=='X')){
    		printf("\nToll gemacht!");
    	else if(input[0] == '\n')
    		exit(-1);
    	else
    		printf("\nFalsche Eingabe");
    
    	deleteBuffer();
    	sinnlos();
    
    void deleteBuffer(){
    	char c;
    
    	do{
    		c=getchar();
    	}while(c!='\n');
    

    Also das (sinnlose) Programm verlangt eine Zahl zwischen 1-8 und dahinter ein X (Sinn und Zweck ist hier erstmal nicht vorhanden!!!). Das Programm ruft sich auch immer wieder selber auf.
    Gibt man irgendwas falsches an, z.b: "blabla" dann wird "Falsche Eingabe" ausgegeben und die Funktion wird wieder aufgerufen.

    Jetzt kommen wir mal zum Problem:
    Gebe ich "8Xabcde" ein ist alles kein Problem. Der Code nimmt das "8X" auf und löscht den Rest aus dem Puffer bzw. aus stdin(?)
    mithilfe von deleteBuffer, denn sonst würde beim nächsten Aufruf von "fgets" das "abc" kopiert.
    Gebe ich aber z.b. nur "5" oder eine richtige Eingabe z.b. "6X" ein, dann hängt das Programm bei deleteBuffer und man muss aufgrund der Zeile "c=getchar()" ein Enter drücken.
    An sich kein Weltuntergang, dennoch möchte ich das vermeiden. Und überhaupt verstehe ich nicht weshalb das geschieht.
    Bei Eingaben > 2 geschieht dies nicht. Nur bei Eingaben <= 2. Ich weiss, dass dies mit fgets und getchar und stdin zusammenhängt,
    weiß aber nicht wo genau das Problem liegt.

    Würde mich über jegliche Hilfe freuen.

    PS: Eine Nebenfrage: Kann man anders als mit "deleteBuffer" den Eingabestrom (stdin) löschen? Mit fflush() funktioniert das nicht.



  • Wenn du alles richtig eingibst (oder weniger), wird das '\n' schon vom fgets eingelesen.
    Also steht es auch nicht mehr im Eingabestrom.
    Du kannst input mit Hilfe von strchr auf '\n' untersuchen. und dann entscheiden, ob du noch mehr einlesen musst.

    Zur Nebenfrage: Nein, kann man nicht.



  • Ok, also das '\n' wird ins input kopiert bei Eingaben <=2 !
    Wie löse ich aber jz das Problem? Der naive User kann ja Eingaben <=2 eingeben.

    Du kannst input mit Hilfe von strchr auf '\n' untersuchen. und dann entscheiden, ob du noch mehr einlesen musst.

    Kannst du das näher erläutern? Inwiefern hilft mir das mein Problem zu lösen?



  • Mit strchr kannst du die Position von Zeichen in einem String bestimmen (sofern vorhanden).

    if(strchr(input, '\n') == NULL)  // wenn kein '\n' in input ist
        deleteBuffer();                // dann bis Zeilenende lesen
    


  • Danke dir hat funktioniert


Anmelden zum Antworten