Merkwürdiges Problem mit Schleife...



  • Hallo allerseits, ich habe da ein "kleines" Problem mit meinem Tic Tac Toe 😕 Ich komme gut voran, im Moment bin ich an der Neustart-Funktion. Doch komischerweise will die Schleife, welche ich brauche um die Eingabe zu überprüfen (also J/j für Ja und N/n für Nein) einfach nicht funktionieren. Ich kanns mir nicht erklären, hab mir die Variable "antwort" schon ausgeben lassen, es steht immer das richtige drin, bzw. das was eingegeben wurde. Ich habe irgendwie das Gefühl dass das ganze nicht richtig geprüft wird. Wenn ich die Schleife weglasse, funktioniert's -.- 😞

    Also in einem Satz: Die Schleife wird nie verlassen, egal was eingegeben wird... 👎

    Hier die Funktion:

    printf("\n\nEs sind keine weiteren Spielzüge mehr moeglich...");
    neustartAntwort = neustart();
    

    Das wäre der Aufruf im Main..

    char neustart(void)
    {
        int antwort;
    
            while(antwort != 'j' || antwort != 'J' || antwort != 'n' || antwort != 'N')
            {
                fflush(stdin);
                printf("\n\nNeues Spiel starten?(J/N):  ");
                scanf("%c", &antwort);
            }
    
        printf("\a"); //Diese Tonausgabe ist nur implementiert, um zu sehen ob die Schleife überhaupt verlassen wird
        abbruch = true;
        return antwort;       
    }
    

    Wäre sehr dankbar um Hilfe.. 😞



  • while((antwort != 'j') || (antwort != 'J') || (antwort != 'n') || (antwort != 'N'))
    

    Probier's mal so.



  • while(antwort != 'j' || antwort != 'J' || antwort != 'n' || antwort != 'N')
    

    Sicher, dass du da ODER verwenden wolltest? 😉 Wenn 'j', dann sicher nicht 'J', 'n' und 'N'...



  • pointercrash() schrieb:

    while((antwort != 'j') || (antwort != 'J') || (antwort != 'n') || (antwort != 'N'))
    

    Probier's mal so.

    Eher so:

    while((antwort != 'j') && (antwort != 'J') && (antwort != 'n') && (antwort != 'N'))
    


  • bei sowas hilft es, einfach mal ein Beispiel durchzugehen

    angenommen, der User gibt 'j' ein

    'j' != 'j' == FALSE
    'j' != 'J' == TRUE
    'j' != 'n' == TRUE
    'j' != 'N' == TRUE
    
    FALSE || TRUE || TRUE || TRUE == TRUE
    

    Das Ergebnis ist immer TRUE

    die zusätzlichen Klammern sind nicht notwendig



  • _matze schrieb:

    Eher so:

    while((antwort != 'j') && (antwort != 'J') && (antwort != 'n') && (antwort != 'N'))
    

    Upps, ja. Eins fehlt noch, um sicherzustellen, daß er nicht gleich rausfliegt:

    int antwort = 0;
    

    Hamma's? 😃



  • pointercrash() schrieb:

    Upps, ja. Eins fehlt noch:

    int antwort = 0;
    

    Hamma's? 😃

    Richtig, aber wie wär's mit

    char antwort=0;
    

    ?



  • Herzlichen Dank für eure Hilfe, irgendwie hab ich den Kopf heute nicht so bei der Sache, eigentlich hätte ich merken sollen was zwutz aufgeschrieben hat:

    zwutz schrieb:

    bei sowas hilft es, einfach mal ein Beispiel durchzugehen

    angenommen, der User gibt 'j' ein

    'j' != 'j' == FALSE
    'j' != 'J' == TRUE
    'j' != 'n' == TRUE
    'j' != 'N' == TRUE
    
    FALSE || TRUE || TRUE || TRUE == TRUE
    

    Das Ergebnis ist immer TRUE

    die zusätzlichen Klammern sind nicht notwendig

    @zwutz: Danke diesen Tipp werd ich mir merken! 🙂 👍

    Wünsche allen einen schönen Tag und ev. schon guten Appetit 😃
    mfg PapaNoah



  • PapaNoah schrieb:

    Wünsche allen einen schönen Tag und ev. schon guten Appetit 😃

    Gleichfalls! 😉



  • pointercrash() schrieb:

    _matze schrieb:

    Eher so:

    while((antwort != 'j') && (antwort != 'J') && (antwort != 'n') && (antwort != 'N'))
    

    Upps, ja. Eins fehlt noch, um sicherzustellen, daß er nicht gleich rausfliegt:

    int antwort = 0;
    

    Hamma's? 😃

    Wäre da eine Fußgesteuerte Schleife nicht ohnehin sinnvoller, da logischer !?!



  • Ja, definitiv...



  • Korhil schrieb:

    pointercrash() schrieb:

    _matze schrieb:

    Eher so:

    while((antwort != 'j') && (antwort != 'J') && (antwort != 'n') && (antwort != 'N'))
    

    Upps, ja. Eins fehlt noch, um sicherzustellen, daß er nicht gleich rausfliegt:

    int antwort = 0;
    

    Hamma's? 😃

    Wäre da eine Fußgesteuerte Schleife nicht ohnehin sinnvoller, da logischer !?!

    Bereits erledigt, wurde eben gerade persönlich darauf hingewiesen ^^



  • Die inneren Klammern sollten nicht nötig sein, weil != schwächer bindet als ||.
    (In C99 steht auch irgendwo in den Headern #define and &&, ist manchmal übersichtlicher)
    Es sollte also auch so gültig sein:

    while (antwort != 'j' and antwort != 'J' and antwort != 'n' and antwort != 'N')
        /* ... */;
    

    Für viele Zeichen könnte man auch eine Vergleichsfunktions verwenden:

    while (!memchr("jJnN", antwort, 4))
        /* ... */;
    

    EDIT:
    #define schächer stärker



  • bgdnoy schrieb:

    Die inneren Klammern sollten nicht nötig sein, weil != schwächer bindet als ||.

    Ja, alles richtig, aber es gibt dann doch ein paar Gründe, das als erstes zu machen. Bei anderen Sprachen ist da gelegentlich umgestellt.
    Hauptsächlich mache ich das aus optischen Gründen, wenn ich mir nicht zu 100% sicher bin, Klammerung funktioniert in allen Sprachen, die das vorsehen.
    Daß ich den Test im Geiste nicht durchgegangen bin, mea culpa.


Anmelden zum Antworten