Frage zur Schleife in folgendem Code



  • Sorry, aber des ist ja das markel.
    Ich bin Schüler und wir dürfen nichts neues verwenden. Bzw nichts verwenden was wir noch nicht hatten, dass es jeder nachvollziehen kann.
    D.h. keine Funktionen die wir noch nicht hatte. :S

    Vllt funktioniert des ja auch so. Dafür auch danke 🙂

    Hab eben versucht des in ne Funktion zu packen. Hat ja auch geklappt, allerdings durchläuft er des iwie doppelt... So wie davor auch...

    char menue2();
    
    while(menue != '0'){
    		do{
    		menue = menue2();
    		}
    		while(menue != '3' && menue != '2' && menue != '1' && menue != '0');
    		if(menue == '1'){
    			printf("Version\t1.0\nAutor\tThomas Mueller\n");
    			printf("\n\nWenn Sie das Spiel beginnen, sehen Sie ein leeres Feld vor sich.\n");
    			printf("Der erste Spieler beginnt das Spiel und setzt ein 'X' in die Spalten 0-7.\n");
    			printf("Der zweite Spieler setzt das Spiel nun fort und setzt eine 'O'\nin die Spalten 0-7.\n");
    			printf("Das Spiel endet, sobald ein Spieler 4 mal die 'X' bzw. die 'O'\nin einer Reihe vertikal, horizontal oder diagonal gelegt hat.\n\n");
    			printf("Copyright by Thomas Mueller\n\n");
    		}
    }
    
    char menue2(){
    	char menue;
    	printf("\nKlicken Sie:\n\n0 Beenden\n1 Info\n2 Spieler vs. Spieler\n3 Spieler vs. Computer\n");
    	scanf("%c", &menue);
    	system("cls");
    	return menue;
    }
    


  • Die Zeile vor die scanf Aufrufe einzubauen, war so gemeint:

    ...
    
    printf("\nKlicken Sie:\n\n0 Beenden\n1 Info\n2 Spieler vs. Spieler\n3 Spieler vs. Computer\n");
    while ((c = getchar()) != EOF && c != '\n'); // <-- dada
                scanf("%c", &menue);
                system("cls");
    ...
    

    You versteh ?

    Und als die zweite Möglichkeit, das Auslagern war so gemeint:

    void puffer_leeren()
    {
        while ((c = getchar()) != EOF && c != '\n');
    }
    

    Um es dann im Programm aufzurufen:

    ...
    
    printf("\nKlicken Sie:\n\n0 Beenden\n1 Info\n2 Spieler vs. Spieler\n3 Spieler vs. Computer\n");
    while ((c = getchar()) != EOF && c != '\n');
        puffer_leeren(); // <-- dada
                scanf("%c", &menue);
                system("cls");
    ...
    

    🙂



  • Dadurch, daß du das in eine eigene Funktion auslagerst, ändert sich auch am Grundproblem nichts. Und das liegt etwa so:

    Der letzte scanf()-Aufruf vor deiner Schleife hat die Eingabe so weit gelesen, wie er sie interpretieren konnte. Eventuelle Leerzeichen und das ENTER, mit dem du die Eingabe beendet hast, bleiben im Tastaturpuffer stehen, bis sie gebraucht werden. Der scan("%c",&menue); holt sich nun das erste Zeichen aus dem Eingabepuffer - also höchstwahrscheinlich das ENTER von oben.
    Die Lösung des Dilemmas ist ganz einfach, den Eingabepuffer bis einschließlich dieses ENTER einzulesen und wegzuwerfen - genau das macht progingmania's Schleife. Wenn du willst, kannst du dort das getchar() auch durch einen scanf()-Aufruf ersetzen:

    char dummy;
    while(scanf("%c",&dummy),dummy!='\n');
    


  • Ah hehe, jetzt weis ich was ihr mein.
    Allerdings haben wir in der Schule das:

    fflush(stdin);
    

    zum Puffer löschen gelernt.
    Hatte da allerdings nicht dran gedacht sorry.
    Mit fflush(stdin); funzt des jetzt auch prima.

    danke für die Hilfe, auch wenn ich dieses getchar net benutzen darf *gg*

    gruß Global



  • CStoll schrieb:

    ... genau das macht progingmania's Schleife. ... // +g

    Die hab ich selbst nur geklaut, von c.rackwitz 😃



  • GlobalDeeJay schrieb:

    Ah hehe, jetzt weis ich was ihr mein.
    Allerdings haben wir in der Schule das:

    fflush(stdin);
    

    zum Puffer löschen gelernt.

    Und wenn du jemals ernsthafte Programme schreiben willst, solltest du DAS schnell wieder vergessen. fflush() schickt einen Ausgabepuffer aus dem Programm heraus, das Verhalten mit stdin ist undefiniert (MSVC macht das, was du erwartest, auf anderen Systemen könntest du dir damit die Festplatte schrotten oder den vierten Weltkrieg auslösen).



  • Und wenn du jemals ernsthafte Programme schreiben willst, solltest du DAS schnell wieder vergessen. fflush() schickt einen Ausgabepuffer aus dem Programm heraus, das Verhalten mit stdin ist undefiniert (MSVC macht das, was du erwartest, auf anderen Systemen könntest du dir damit die Festplatte schrotten oder den vierten Weltkrieg auslösen).

    Im Ernst? Sollt ich vllt mal meinem Lehrer sagen? ^^
    Meine "Mathelehrer" der auch Programmieren unterrichtet will dür sowas immer beweise.. Habt ihr einen? *gg*



  • *musslehrertötengehen*



  • GlobalDeeJay schrieb:

    Meine "Mathelehrer" der auch Programmieren unterrichtet will dür sowas immer beweise.. Habt ihr einen? *gg*

    Ja, den ANSI-Standard (hab ich leider nicht vorrätig). Und daß fflush(stdin); Unsinn ist, muß man nicht beweisen - das ist so festgelegt (genauso wie die Tatsache, daß main() einen int zurückgeben muß).



  • Na gut, dann schreib ich dem mal ne Mail dass der uns voll den Dreck beibringt oder wie?
    Aber anscheinend funktioniert es ja bei "uns", dass der Puffer dann iwie leer is.
    Und wie meinst des mit anderen Pattformen? Wenn mans durch nen anderen Compiler schmeißt?
    Aber gut, danke für den Hinweis 😉



  • GlobalDeeJay schrieb:

    Und wie meinst des mit anderen Pattformen? Wenn mans durch nen anderen Compiler schmeißt?

    Genau das meinte ich (und in der Praxis solltest du dich möglichst wenig auf "Features" verlassen, die auf undefiniertem Verhalten der Sprache aufbauen - irgendwann willst du sicher, daß jemand anderes mit deinen Programmen arbeiten kann).



  • Microsoft und fflush:
    http://msdn2.microsoft.com/en-us/library/9yky46tz(VS.80).aspx

    Weiter unter im Beispiel steht dann bei der Verwendung von fflush(stdin);

    Microsoft schrieb:

    ...  
       // You must flush the input buffer before using gets. 
       // fflush on input stream is an extension to the C standard 
       fflush( stdin );   
    ...
    


  • Wie ich sagte, unter MS funktioniert's - im realen Leben würde ich es nicht anwenden wollen 😉
    (ja, ich arbeite hauptamtlich mit dem MSVC, aber trotzdem ;))



  • Genau das wollte ich damit ausdrücken...

    Wenn es nicht standardkonform ist, lieber was standardkonformes nehmen... 😉


Anmelden zum Antworten