pero noté que a partir de cierto número de cifras, el programa terminando arrojando solo la línea de error.
Los números los estás almacenando en b
, que es de tipo int
. El tipo int
es un tipo de dato entero con signo. Este tipo de dato, de 32 bits, usa un bit para almacenar el signo y los 31 restantes para almacenar el número propiamente dicho.
Es decir, para 31 bits, el número más grande que puede admitir es: 2^31-1 = 2.147.483.647.
Si intentas introducir un número más grande, cin
no podrá almacenarlo en la variable y esto hace que se active un flag de error... a partir de ese momento cin
se bloquea hasta que trates el error.
Lo más habitual en estos casos es limpiar el flag de error y vaciar el buffer de entrada:
while (b > 9999 || b < 1110) {
std::cout << "\nE R R O R. Favor de ingresar un numero de cuatro digitos.\n";
std::cin >> b;
if( std::cin.fail() )
{
std::cin.ignore(std::numeric_limits<int>::max(),'\n');
std::cin.clear();
}
}
Donde:
numeric_limits
es una plantilla de C++ que te proporciona información sobre los tipos numéricos. En este caso le estamos pidiendo el valor más alto que puede ser almacenado en una variable de tipo int
. numeric_limits
se encuentra en la librería limits
.
cin.ignore
descarta caracteres de entrada... en este caso descartará todo lo que haya hasta que se encuentre con un salto de línea (que también será descartado). El primer parámetro indica el número de bytes a descartar... de ahí que se use numeric_limits
... queremos descartar el máximo posible.
cin.clear
resetea el flag de error, lo que hace que cin
vuelva a estar disponible para leer nuevos valores.
EDITO
El problema de la respuesta anterior es que no contempla el caso de que se introduzca una entrada incorrecta en la primera iteración. No me gusta repetir código, por lo que una posible solución sería la siguiente:
int main()
{
int b;
bool pedirNumero = true;
while(pedirNumero)
{
std::cin >> b;
pedirNumero = std::cin.fail() || b > 9999 || b < 1110;
if( pedirNumero )
{
std::cout << "\nE R R O R. Favor de ingresar un numero de cuatro digitos.\n";
std::cin.ignore(std::numeric_limits<int>::max(),'\n');
std::cin.clear();
}
}
std::cout << b;
}