Fehlerbehandlung



  • Moin Leute,
    ich lerne momentan die Grundlagen von C++ und arbeite dafür das 'C++ - Ein Einführung' von Breymann durch. Dabei ist mir im Kapitel über do-while-Schleifen ist Problem aufgefallen, dass ich nicht so ganz verstehe...
    Unten ist das Programm aus dem Buch. Dabei handelt es sich um ein einfaches zahlenraten:

    #include <iostream>
    using namespace std;
    
    int main() {
       bool istEingabeOk;
       do {
          int zuRatendeZahl = 7;
          int geraten;
          cout << "Bitte eine Zahl von 1-10 eingeben: ";
          cin >> geraten;
          istEingabeOk = cin.good();
          if(istEingabeOk) {
             if(geraten == zuRatendeZahl) {
                cout << "Richtig geraten!\n";
             }
             else {
                cout << "Leider falsch!\n";
             }
          }
          else {
             cout << "Eingabefehler! Nochmal versuchen!\n";
             cin.clear(); 
             cin.ignore(1000, ’\n’);
          }
       } while(!istEingabeOk); 
    }
    

    Im Buch steht, dass bei Eingabe von z.B. 78xyz der Status von cin.good() den Wert True annimmt, da das Programm nur die 78 einliest. Wenn aber z.B. AB123nn eingegeben werden sollte, würde cin.good() False werden und das Programm sollte dann eine erneute Eingabe fordern. Wenn ich das Programm bei mir durchlaufen lasse und AB123nn eingebe, bekomme ich jedoch die Meldung 'Leider falsch!', d.h., dass cin.good() True sein muss. Woran liegt das?

    Und eine weitere Frage: Ich verstehe noch nicht so ganz, was der

    cin.ignore(1000, ’\n’);
    

    genau macht. Im Buch steht, dass der Rest der Zeile ignoriert werden soll. Ich habe spaßeshalber den Wert in Klammern mal auf 3 reduziert und verschieden lange Zeichenketten eingegeben. Bei 3 'falschen' Zeichen bekam ich die Meldung: Eingabefehler! Nochmal versuchen!
    eine Zahl von 1-10 eingeben:

    bei 4 Zeichen dann
    Eingabefehler! Nochmal versuchen!
    eine Zahl von 1-10 eingeben:
    Eingabefehler! Nochmal versuchen!
    eine Zahl von 1-10 eingeben:

    bei 9 Zeichen:
    Eingabefehler! Nochmal versuchen!
    eine Zahl von 1-10 eingeben:
    Eingabefehler! Nochmal versuchen!
    eine Zahl von 1-10 eingeben:
    Eingabefehler! Nochmal versuchen!
    eine Zahl von 1-10 eingeben:

    usw.
    Bedeutet der Befehl dann, dass das Programm (in dem Fall) jedes vierte Zeichen prüft?
    Vielen Dank im vorraus!



  • @Deuterium42 sagte in Fehlerbehandlung:

    bei mir

    Compiler? Betriebssystem?



  • @Deuterium42 sagte in Fehlerbehandlung:

    Wenn ich das Programm bei mir durchlaufen lasse und AB123nn eingebe, bekomme ich jedoch die Meldung 'Leider falsch!', d.h., dass cin.good() True sein muss. Woran liegt das?

    Möglicherweise hast du vergessen zu kompilieren? Das sollte nicht sein.

    Und eine weitere Frage: Ich verstehe noch nicht so ganz, was der
    cin.ignore(1000, ’\n’);

    genau macht.

    Verwirft (bis zu) 1000 Zeichen aus dem Eingabestrom, maximal jedoch so viele, bis ein Zeilenumbruch (also ein Enter von dir) gelesen wird. Häufig nimmt man std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');, um nicht die etwas zufällig wirkende Obergrenze von 1000 zu haben. Wenn du neun Buchstaben eingibst, werden je 3 pro Scheifendurchlauf verworfen.



  • @wob sagte in Fehlerbehandlung:

    @Deuterium42 sagte in Fehlerbehandlung:

    Wenn ich das Programm bei mir durchlaufen lasse und AB123nn eingebe, bekomme ich jedoch die Meldung 'Leider falsch!', d.h., dass cin.good() True sein muss. Woran liegt das?

    Möglicherweise hast du vergessen zu kompilieren? Das sollte nicht sein.

    Nach einer kreativen Pause samt Systemneustart 'bricht' das Programm nun korrekt ab ... vielleicht war ich wirklich zu müde und hab zwischenzeitig das kompilieren vergessen ...

    Und eine weitere Frage: Ich verstehe noch nicht so ganz, was der
    cin.ignore(1000, ’\n’);

    genau macht.

    Verwirft (bis zu) 1000 Zeichen aus dem Eingabestrom, maximal jedoch so viele, bis ein Zeilenumbruch (also ein Enter von dir) gelesen wird. Häufig nimmt man std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');, um nicht die etwas zufällig wirkende Obergrenze von 1000 zu haben. Wenn du neun Buchstaben eingibst, werden je 3 pro Scheifendurchlauf verworfen.

    Hierzu hätte ich noch eine Frage: Wenn ich

    cin.ignore(3,'\n')
    

    und z.B. 'abcdef' eingebe, sollten die ersten 3 Zeichen (also 'abc') ignoriert werden. Müsste aber dann im nächsten Schleifendurchlauf nicht durch

    cin>>geraten;
    

    eine neue Eingabe erfolgen?



  • Es gibt eine Eingabe, nämlich die 3 Zeichen, die noch im Puffer sind (d e f).