Falsche Eingabe vermeiden



  • Hi!

    Ich habe folgendes Programm:

    #include <stdio.h>
    
    int main(void)
    {
    int r=0, zahl=9;
    while(r==0)
    {
      printf("Geben Sie eine Zahl ein: ");
      r = scanf("%i",&zahl);
    }
    return 0;
    }
    

    Ich möchte jetzt, dass wenn ein Buchstabe oder irgendwas anderes als eine Integer-Zahl eingegeben wird, dass die Aufforderung eine Zahl einzugeben nochmal kommt.
    Gebe ich eine ganze Zahl ein beendet das Programm einfach. Das ist soweit ok.
    Gebe ich jetzt irgendeinen Buchstaben ein, gibt er mir in einer Endlosschleife den Text vom printf-Befehl aus und überspringt irgendwie immer den scanf-Befehl.

    Was läuft da falsch?
    Ausführen, programmieren, compilieren lasse ich das ganze mit MS Visual C++.

    MfG
    Martin



  • man: scanf(3) bleibt beim ersten Zeichen stehen, das es nicht erkannt hat. Das heißt, nach der Fehleingabe steht der falsch eingegebene Buchstabe weiterhin im Eingabepuffer und muß von Hand rausgeholt werden.



  • Hallo!

    Vielen Dank für den Tipp!!! Ich habe das Problem gelöst!
    Ich habe jetzt folgendes benutzt:
    fflush(stdin);
    Der Befehl leert soweit ich weiß den Eingabe-Puffer.
    Damit geht es.
    Programm sieht jetzt so aus:

    int main(void)
    {
    int r=0, zahl=9;
    while(r==0)
    {
      printf("Geben Sie eine Zahl ein: ");
      r = scanf("%i",&zahl);
      fflush(stdin);
    }
    return 0;
    }
    

    MfG
    Martin



  • aber nur in windows (?)



  • Stelfer schrieb:

    aber nur in windows (?)

    Jau. Microsoft fand es "geschickt" eben dieses undefiniterte Verhalten bei fflush(stdin) zu ändern. Mit dem Erfolg, dass man diese unportable Lösung in viel zu vielen C-Büchern findet. Gar nicht nett.



  • TactX schrieb:

    Stelfer schrieb:

    aber nur in windows (?)

    Jau. Microsoft fand es "geschickt" eben dieses undefiniterte Verhalten bei fflush(stdin) zu ändern. Mit dem Erfolg, dass man diese unportable Lösung in viel zu vielen C-Büchern findet. Gar nicht nett.

    Das ist reinste Sprachverwirrung.

    Undefiniertes Verhalten ist eine Eigenschaft von Quelltext. Das Compilat ist immer durch den Übersetzungsumgebung definiert. Wie sollte sich denn ein Compiler deiner Ansicht nach korrekt bei fflush(stdin) oder 'i=i++ + i++' verhalten? Er macht eben 'irgendwas' und im Sinne der Brauchbarkeit auch jedes mal das gleiche.

    PS: Ich vermute übrigens, daß das keine Microsoft-Idee war, aber das spielt keine besondere Rolle.



  • Sorry. Das nächste mal compiliere ich meinen Beitrag wieder mit -pedantic. Versprochen 🙄



  • "undefiniert" ist eine Aussage des C Standard's und bedeutet soviel wie "klar können Sie so etwas fabrizieren, aber wir übernehmen keine Garantie dafür, was Ihr Programm damit anstellt".


Anmelden zum Antworten