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
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());
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)