2010-01-16 7 views
13

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

Ist diese Schleife ich eine ziemlich gute Möglichkeit zur Validierung der Eingabe konstruiert? Oder gibt es einen allgemeineren/akzeptierten Weg, dies zu tun?

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

Antwort

23

Ich bin kein großer Fan von für iostreams auf Ausnahmen drehen. I/O-Fehler sind nicht außergewöhnlich genug, da Fehler oft sehr wahrscheinlich sind. Ich bevorzuge es, Ausnahmen für weniger häufige Fehlerbedingungen zu verwenden.

Der Code ist nicht schlecht, aber überspringt 80 Zeichen ist ein bisschen willkürlich, und die Fehlervariable ist nicht notwendig, wenn Sie mit der Schleife fiedeln (und sollte bool sein, wenn Sie es behalten). Sie können das Lesen von cin direkt in eine if setzen, die vielleicht eher ein Perl-Idiom ist.

Hier ist mein nehmen:

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 von nur 80 Zeichen Skipping, das sind nur kleine Spitzfindigkeiten, und ist eher eine Frage des bevorzugten Stils.

+0

Danke, das ist mehr entlang der Linien von dem, was ich gesucht habe. Sehr geschätzt. Eine Frage, was ist die Bedingung für die for-Schleife (;;)? Versteh das nicht. – Alex

+2

@Alex - 'foo (;;)' bedeutet Schleife für immer, genau wie 'while (1)'. Wenn Sie nicht möchten, dass Ihre Schleife für immer endlos läuft, brauchen Sie irgendwo eine Pause, um die Schleife zu beenden. –

+0

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

3

könnten Sie nicht betrachten try/catch, nur, um Sie auf den Begriff der Ausnahmebehandlung verwendet?

Wenn nicht, warum nicht einen booleschen, statt 0 und 1? Gewöhnen Sie sich von Variablen des richtigen Typs verwenden (und die Schaffung von Typen, wo erforderlich)

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

In der Tat, in vielen Orten ...

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

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

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

2

Eine kleine Sache ist, dass der Fehler Helfer 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()); 
4
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 String für die Eingabe verwenden und dann, dass in eine ganze Zahl konvertieren. Auf diese Weise könnte jemand eingeben eingeben, "Mickey Mouse" oder was auch immer und es wird immer noch antworten.
Auch #include <string> und <sstream>