Gute Eingabevalidierungsschleife mit cin – C++

Lesezeit: 3 Minuten

Ich bin in meiner zweiten OOP-Klasse und meine erste Klasse wurde in C# unterrichtet, also bin ich neu in C++ und übe derzeit Eingabevalidierung mit cin. Also hier meine Frage:

Ist diese Schleife, die ich erstellt habe, eine ziemlich gute Möglichkeit, Eingaben zu validieren? Oder gibt es eine gebräuchlichere/akzeptiertere Methode?

Danke!

Code:

int taxableIncome;
int error;

// input validation loop
do
{
    error = 0;
    cout << "Please enter in your taxable income: ";
    cin >> taxableIncome;
    if (cin.fail())
    {
        cout << "Please enter a valid integer" << endl;
        error = 1;
        cin.clear();
        cin.ignore(80, '\n');
    }
}while(error == 1);

Ich bin kein großer Fan davon, Ausnahmen für Iostreams einzuschalten. E/A-Fehler sind nicht außergewöhnlich genug, da Fehler oft sehr wahrscheinlich sind. Ich ziehe es vor, Ausnahmen nur für weniger häufige Fehlerbedingungen zu verwenden.

Der Code ist nicht schlecht, aber das Überspringen von 80 Zeichen ist etwas willkürlich, und die Fehlervariable ist nicht erforderlich, wenn Sie mit der Schleife herumspielen (und sollte es sein bool wenn du es behältst). Sie können das Lesen von setzen cin direkt in ein ifwas vielleicht eher ein Perl-Idiom ist.

Hier ist meine Meinung:

int taxableIncome;

for (;;) {
    cout << "Please enter in your taxable income: ";
    if (cin >> taxableIncome) {
        break;
    } else {
        cout << "Please enter a valid integer" << endl;
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
}

Abgesehen davon, dass nur 80 Zeichen übersprungen werden, sind dies nur kleine Spitzfindigkeiten und eher eine Frage des bevorzugten Stils.

  • Danke, das entspricht eher dem, was ich gesucht habe. Sehr geschätzt. Eine Frage jedoch, was ist die For-Schleife-Bedingung (;;)? Verstehe das nicht.

    – Alex

    16. Januar 2010 um 4:01 Uhr

  • @Alex – foo(;;) bedeutet Schleife für immer, genau wie while(1). Wenn Sie nicht möchten, dass Ihre Schleife wirklich für immer wiederholt wird, benötigen Sie eine break irgendwo im Inneren, um die Schleife zu beenden.

    – R. Samuel Klatschko

    16. Januar 2010 um 4:30 Uhr

  • Ich hätte in einem solchen Fall normalerweise while(!eof(stdin)), um zu vermeiden, dass der Code verrückt wird, wenn die Eingabe verloren geht … oder wird das hier eine Ausnahme auslösen?

    – PypeBros

    13. August 2012 um 9:40 Uhr

Gute Eingabevalidierungsschleife mit cin C
Ari-frei

int taxableIncome;
string strInput = "";
cout << "Please enter in your taxable income:\n";

while (true) 
{
    getline(cin, strInput);

    // This code converts from string to number safely.
    stringstream myStream(strInput);
    if ( (myStream >> taxableIncome) )
        break;
    cout << "Invalid input, please try again" << endl;
}

Sie sehen also, ich verwende eine Zeichenfolge als Eingabe und konvertiere diese dann in eine Ganzzahl. Auf diese Weise könnte jemand die Eingabetaste, “Micky Maus” oder was auch immer eingeben, und es wird immer noch reagieren.
Beinhaltet auch <string> und <sstream>

Ein kleiner Fehler ist, dass die Error-Helper-Variable vollständig redundant ist und nicht benötigt wird:

do
{
    cin.clear();
    cout << "Please enter in your taxable income: ";
    cin >> taxableIncome;
    if (cin.fail())
    {
        cout << "Please enter a valid integer" << endl;
        cin.ignore(80, '\n');
    }
}while(cin.fail());

Gute Eingabevalidierungsschleife mit cin C
Mawg sagt, Monica wieder einzusetzen

Könnten Sie Try/Catch nicht in Betracht ziehen, nur um sich an das Konzept der Ausnahmebehandlung zu gewöhnen?

Wenn nicht, warum nicht einen booleschen Wert anstelle von 0 und 1 verwenden? Gewöhnen Sie sich an, Variablen des richtigen Typs zu verwenden (und bei Bedarf Typen zu erstellen)

Cin.fail() wird auch unter diskutiert http://www.cplusplus.com/forum/beginner/2957/

In der Tat, an vielen Stellen …

http://www.google.com.sg/#hl=de&source=hp&q=c%2B%2B+tutorial&btnG=Google+Search&meta=&aq=f&oq=c%2B%2B+tutorial

Sie könnten einige davon studieren und versuchen, den Erklärungen zu folgen, warum Dinge auf eine bestimmte Weise getan werden sollten.

Aber früher oder später sollten Sie Ausnahmen verstehen …

988190cookie-checkGute Eingabevalidierungsschleife mit cin – C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy