Buen ciclo de validación de entrada usando cin – C ++

Estoy en mi segunda clase OOP, y mi primera clase se impartió en C #, así que soy nuevo en C ++ y actualmente estoy practicando la validación de entrada usando cin. Así que aquí está mi pregunta:

¿Es este ciclo construido una forma bastante buena de validar la entrada? ¿O hay una forma más común / aceptada de hacerlo?

¡Gracias!

Código:

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

No soy un gran fanático de activar excepciones para iostreams. Los errores de E / S no son lo suficientemente excepcionales, ya que a menudo los errores son muy probables. Prefiero solo usar excepciones para condiciones de error menos frecuentes.

El código no está mal, pero omitir 80 caracteres es un poco arbitrario, y la variable de error no es necesaria si manipulas el loop (y debería ser bool si lo mantienes). Puedes poner la lectura de cin directamente en un if , que es quizás más un modismo de Perl.

Aquí está mi opinión:

 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::max(), '\n'); } } 

Además de omitir solo 80 caracteres, estos son solo pequeños problemas, y son más una cuestión de estilo preferido.

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

Entonces ves que uso string para la entrada y luego lo convierto en un entero. De esta forma, alguien podría escribir enter, 'mickey mouse' o lo que sea y todavía responderá.
También #include y

Una pequeña objeción es que la variable auxiliar de error es completamente redundante y no es necesaria:

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

¿No podría considerar intentar / atrapar, solo para acostumbrarse al concepto de manejo de excepciones?

Si no, ¿por qué no utilizar un booleano, en lugar de 0 y 1? Adquiera el hábito de usar variables del tipo correcto (y de crear tipos cuando sea necesario)

Cin.fail () también se trata en http://www.cplusplus.com/forum/beginner/2957/

De hecho, en muchos lugares …

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

podría estudiar algunos de ellos e intentar seguir las explicaciones de por qué las cosas deberían hacerse de cierta manera.

Pero, tarde o temprano, debes entender las excepciones …