Falsche Eingaben mit scanf abfangen



  • Hallo,

    ich hoffe ihr könnt mir helfen.
    Wie kann ich mit scanf falsche Eingaben abfangen? Ich meine, wenn z.B. der Eingabewert ein Integer sein soll, der Anwender aber ein char eingibt. Folgendermaßen habe ich es versucht:

    int Anzahl;
        do
        {
          short Eingabe;
          printf("Bitte Spieleranzahl eingeben : ");
          Eingabe = scanf("%i", &Anzahl);
          clrscr();
          if (Eingabe == 0)
            Anzahl = 5;
        }while ((Anzahl < 1) || (Anzahl > 4));
    

    Leider wird bei dieser Methode die Schleife durchlaufen, ohne bei scanf auf die Eingabe zu warten. Diese Schleife ist also eine Endlosschleife, da die Variable "Eingabe" immer auf 0 bleibt.

    Vielen Dank für eure Mühe!



  • Warum postet eigentlich jeder Anfänger jedes Standard-C-Problem im C++-Forum? Wohin mit meiner Frage?



  • Hallo,
    bitte vor dem Posten die Suchfunktion benutzen.

    Am 28.03.2003 hatten wir einen Beitrag "Falscheingaben mit scanf abfangen"

    Und verschoben nach ANSI-C.

    [ Dieser Beitrag wurde am 07.04.2003 um 10:27 Uhr von HumeSikkins editiert. ]



  • wenns ganz schlau bist, dann prüfst du die eingabe per zeichen (getch oder so). dann kannst du dir sicher sein. evtl kann die performance leiden, da schon mehr zu machen ist für den prozessor, aber wenn ich sicher gehen will, daß niemand was falsches eingibt, dann lese ich jedes zeichen und konvertiere mir des. (für heutige prozessoren ka thema, gell)

    gruss
    freez



  • Setzte:

    fflush(stdin);

    vor scanf(); und damit wird der Tastaturpuffer geleert und das Programm rauscht nicht an scanf(); vorbei. (Unter Linux kann dies trotzdem zu Problemen führen, dann würd ich fgets() nehmen)

    ----------
    Die Endlosschleife kannst du mit

    break;

    abbrechen.
    ----------
    Um zu überprüfen ob der User einen Integer eingegeben hat, kannst du zum Beispiel den Rückgabe Wert von scanf(); überprüfen. Die Eingabe ist richtig wenn dieser genauso hoch ist wie die Anzahl der eingelesenen Argumente, dass heiß in deinem Fall genau 1.

    -----
    FREAK



  • Original erstellt von <FREAK>:
    **Setzte:

    fflush(stdin);**

    fflush(stdin); ist eine Krankheit, anders gesagt: undefiniertes Verhalten. Mit Standard-C hat das jedenfalls nichts zu tun.



  • Wenn du fflush(); nicht verwenden willst dann nimm es nicht, es gibt etliche etwas umständlicher Alternativen. Für Log Files ist fflush(); auf jeden Fall praktisch, außer du arbeitest ungepuffert (lol).



  • Original erstellt von <FREAK>:
    Für Log Files ist fflush(); auf jeden Fall praktisch,

    Aus Logfiles liest man für gewöhnlich auch nicht, sondern schreibt in diese.



  • Und wenn das was zu schreiben ist, im Buffer ist und dein Prog oder OS abstürtzt, brauchst du erst überhaupt nicht anfangen LogFiles anzulegen. Unter Linux könnte man sync verwenden, aber das wär ja kein ANSI Standart. Ich kenne keine andere Möglichkeit außer fflush(); oder ungebuffertes schreiben ein zu stellen, was sehr langsam ist.



  • @FREAK:
    fflush(stdin) ist eine Krankheit
    nicht fflush(stdout)

    fflush ist nur für ausgabeströme definiert!


Anmelden zum Antworten