Schleifenformat beim Einlesen



  • Sehr abstrakter Titel, zugegeben. Ich wollte fragen, ob folgender Code in Ordnung ist bzw. wie man ihn verbessern könnte. Es geht mir darum, solange Werte einzulesen, wie die Eingabe korrekt ist und eine entsprechende Ausgabe zu haben. Ich möchte aber auf jeden Fall überflüssige Abfragen vermeiden und irgendwie fällt mir nicht ein, wie ich es ohne das Komma machen kann. Jemand eine Idee?

    int main ()
    {
        double i;
    
        while (cout << "> ", cin >> i) {
            cout << "is: " << i << endl;
            cin.clear();
            cin.ignore(cin.rdbuf()->in_avail());
        }
    }
    

    Ein Dialog (Ein- und Ausgabe) könnte dann z.B. so aussehen:

    $ ./test
    > 1
    is: 1
    > 1.2
    is: 1.2
    > 12.3
    is: 12.3
    > xyz
    
    $
    

    /EDIT: Um es nochmal konkret zu sagen: Mir gefällt die 'while'-Bedingung nicht, denn IMHO ist diese Komma-Anweisung nicht sehr sprechender Code.



  • Was spricht denn dagegen, den Komma-Operator zu verwenden? Das ist ein vollwertiger Operator in C++. Die einzige Änderung wäre, den durch ein && zu ersetzen (das würde auch eventuelle Ausgabefehler abfangen).

    PS: das "cin.clear()" brauchst du nur, wenn bei der Eingabe ein Fehler aufgetreten ist, also bestimmt nicht im Inneren der while()-Schleife.



  • CStoll schrieb:

    Was spricht denn dagegen, den Komma-Operator zu verwenden? Das ist ein vollwertiger Operator in C++. Die einzige Änderung wäre, den durch ein && zu ersetzen (das würde auch eventuelle Ausgabefehler abfangen).

    Ja, aber das ist doch nicht lesbar. Letztendlich hängt die Bedingung von der Ausgabe ja nicht ab (soll sie auch nicht, daher ja ',' statt 'and'). Daher hat sie in der Bedingung eigentlich auch nix zu suchen.

    PS: das "cin.clear()" brauchst du nur, wenn bei der Eingabe ein Fehler aufgetreten ist, also bestimmt nicht im Inneren der while()-Schleife.

    Ups, stimmt ja.



  • int main()
    {
        double i;
    
        while (1) {
            cout << "> ";
            if (!(cin >> i))
                break;
            cout << "is: " << i << endl;
        //  cin.clear();
            cin.ignore(cin.rdbuf()->in_avail());
        }
    }
    

    Effektiv ist das genau dasselbe. Das "if" ist in deiner Version auch da, bloss "versteckt".


Anmelden zum Antworten