Después de llamar al clear
, debe eliminar de algún modo la entrada no válida de la transmisión. Aquí está una manera:
cin >> arr[index];
if (!cin)
{
cin.clear();
std::string ignoreLine; //read the invalid input into it
std::getline(cin, ignoreLine); //read the line till next space
index--;
continue;
}
Es porque cuando cin
no puede leer la entrada no válida, permanece allí en la corriente. Tiene que ser eliminado, de alguna manera. Acabo de leer e ignorarlo.
También se puede utilizar como ignore
:
cin.clear();
cin.ignore(std::numeric_limits<streamsize>::max(),' ');
que es mejor en mis entradas de opinión siempre son espacio separado (y si no desea inspeccionar la entrada no válida). El online doc dice:
istream :: ignorar
istream & ignorar (streamsize n = 1, int delim = EOF);
extraer y descartar caracteres
Extractos caracteres de la secuencia de entrada y los descartes.
La extracción finaliza cuando se han extraído n caracteres y se ha descartado o cuando se encuentra el delimitador de caracteres, lo que ocurra primero. En este último caso, también se extrae el caracter delim.
De ahí el ciclo infinito !! –
@ Mr.DDD: Exactamente. :-) – Nawaz
@ Mr.DDD: ¿Qué entrada no válida proporcionaste? – Nawaz