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 if
was 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.

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)
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 …
9881900cookie-checkGute Eingabevalidierungsschleife mit cin – C++yes