Goede invoervalidatielus met cin – C++

Ik zit in mijn tweede OOP-klas en mijn eerste klas werd gegeven in C#, dus ik ben nieuw in C++ en momenteel oefen ik invoervalidatie met cin. Dus hier is mijn vraag:

Is deze lus die ik heb geconstrueerd een redelijk goede manier om invoer te valideren? Of is er een meer gebruikelijke/geaccepteerde manier om dit te doen?

Bedankt!

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

Antwoord 1, autoriteit 100%

Ik ben geen grote fan van het inschakelen van uitzonderingen voor iostreams. I/O-fouten zijn niet uitzonderlijk genoeg, in die zin dat fouten vaak zeer waarschijnlijk zijn. Ik gebruik liever alleen uitzonderingen voor minder frequente foutcondities.

De code is niet slecht, maar het overslaan van 80 tekens is een beetje arbitrair, en de foutvariabele is niet nodig als je met de lus speelt (en zou boolmoeten zijn als je hem behoudt) . Je kunt de read van cindirect in een ifzetten, wat misschien meer een Perl-idioom is.

Dit is mijn mening:

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

Afgezien van het overslaan van 80 tekens, zijn dit slechts kleine opmerkingen en meer een kwestie van voorkeursstijl.


Antwoord 2, autoriteit 15%

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

Dus je ziet dat ik string gebruik voor invoer en dat vervolgens converteer naar een geheel getal. Op deze manier kan iemand enter typen, ‘mickey mouse’ of wat dan ook en het zal nog steeds reageren.
Ook #include <string>en <sstream>


Antwoord 3, autoriteit 6%

Een klein minpuntje is dat de fouthulpvariabele volledig overbodig is en niet nodig is:

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

Antwoord 4, autoriteit 6%

Zou je proberen/catch niet kunnen overwegen, alleen om je te laten wennen aan het concept van exception handling?

Zo niet, waarom zou u dan geen boolean gebruiken in plaats van 0 en 1? Maak er een gewoonte van om variabelen van het juiste type te gebruiken (en waar nodig typen te creëren)

Cin.fail() wordt ook besproken op http://www.cplusplus.com /forum/beginner/2957/

In feite, op veel plaatsen …

http://www.google.com.sg/#hl=en&amp b ;Source=HP&amp ;Q=c%2b%2b+tutorial&amp ; BTNG = Google + Search & AMP; META = & AMP; AQ = F & AMP; OQ = C% 2B% 2B + TUTORIAL

Je zou sommige van die kunnen bestuderen en proberen de uitleg te volgen van waarom dingen op een bepaalde manier moeten worden gedaan.

Maar vroeg of laat zou je uitzonderingen moeten begrijpen …

Other episodes