Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ciclo salta cin al presionar un NO NÚMERO con variable INT

Estas en el tema de Ciclo salta cin al presionar un NO NÚMERO con variable INT en el foro de C/C++ en Foros del Web. Hola! No se por que razon cin se omite dentro de un ciclo que espera un número para Variable INT provocando ciclos infinitos! Aqui un ...
  #1 (permalink)  
Antiguo 15/06/2012, 00:04
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 4 meses
Puntos: 32
Ciclo salta cin al presionar un NO NÚMERO con variable INT

Hola!

No se por que razon cin se omite dentro de un ciclo que espera un número para Variable INT provocando ciclos infinitos!

Aqui un ejemplo cualquiera de la falla.

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. int main()
  5. {
  6.     do {
  7.         int key;
  8.         cout << "Presiona el numero 4." << endl;
  9.         cin >> key;
  10.     }
  11.     while( key!=4 );
  12. }

Si presionas un número que no sea el 4, te vuelve a pedir el número normalmente pero si presionas una tecla que no sea un número entonces se BUGEA y se repite indefinidamente ya que salta el std::cin.

Por cierto, ando usando el dev c++ beta 5.

Que sucede???, muchas gracias :)
  #2 (permalink)  
Antiguo 15/06/2012, 02:47
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Ciclo salta cin al presionar un NO NÚMERO con variable INT

Si no recuerdo mal, el problema viene en que si introduces un valor que no sea un entero, se produce un error interno y tendrías que limpiar la entrada de datos mediante clear.

Prueba lo siguiente:

Código C++:
Ver original
  1. using namespace std;
  2. int main()
  3. {
  4.     do {
  5.         int key;
  6.         cout << "Presiona el numero 4." << endl;
  7.         cin >> key;
  8.  
  9. if(!cin.good()){
  10.     cin.clear();
  11.     cin.ignore( INT_MAX, '\n' );
  12. }
  13.  
  14.     }
  15.     while( key!=4 );
  16. }
  #3 (permalink)  
Antiguo 15/06/2012, 17:43
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Ciclo salta cin al presionar un NO NÚMERO con variable INT

Hola @alexg88, GRACIAS.

Si funcionó solo que creo que Dev C++ beta 5 tiene bug, por que si presiono un no número la primera vez pasa lo mismo pero si presion un número y luego un no número funciona bien. En cambio, probé en Visual Express y aqui ya funciona bien aunque la primera vez se presione un no número, entonces cabe deducir que el compilador de dev c++ beta 5 tiene un bug interno :(.

Por último, ¿Podría explicarme como funcionan los métodos std::cin.clear/ignore?, Muchas gracias!

Soy nuevo en C++ pero como ya tengo experiencia en lenguaje de programación web, se me facilita mucho el aprendizaje :) pues la ideología es la misma aunque más estricto jeje.
  #4 (permalink)  
Antiguo 16/06/2012, 10:45
 
Fecha de Ingreso: noviembre-2006
Mensajes: 166
Antigüedad: 18 años
Puntos: 6
Respuesta: Ciclo salta cin al presionar un NO NÚMERO con variable INT

Muy interesante... de verdad que no sabía de esto.
Cuando yo declaraba a una variable determinado tipo, y si luego se leía una expresión de otro tipo, a veces pasaba esto... Como que se "trababa" la consola y comenzaba a imprimir el mensaje que pedía que se ingrese el dato de manera seguida sin detenimiento jaja.
En mi primer ciclo aún nos están enseñando cosas muy básicas, pero de seguro que también quisiera que expanda un poco más su explicación acerca de ese "clean" dentro del cin.
Nos han estado haciendo trabajar uniformemente con el Visual Studio... pero como que es algo pesado. Sólo un docente astuto es el que codifica en DevC++ (que de seguro es mucho más ligero). Y pues, la otra vez buscando información, quise descargarme un programa llamado Geany, que a simple vista era de entorno muy agradable y sumamente ligero.
Gracias.
  #5 (permalink)  
Antiguo 16/06/2012, 15:10
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Ciclo salta cin al presionar un NO NÚMERO con variable INT

A lo que he leido cin.clear() limpia el ultimo estado de error dado cuando se ingresa un caracter no valido, como cuando estamos pidiendo un INT y nos dan un CHAR.
Y cin.ignore no lo entiendo muy bien pero segun ignora los caracteres escritos en la ultima linea, espero y alguien pueda explicarlo bien, saludos.
  #6 (permalink)  
Antiguo 16/06/2012, 15:28
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años, 6 meses
Puntos: 344
Respuesta: Ciclo salta cin al presionar un NO NÚMERO con variable INT

Buenas,

Dentro del objeto cin, existe un flag que indica si la lectura que se ha hecho ha sido válida o incorrecta.

El método clear resetea ese flag al estado inicial.

El método ignore, como has dicho, elimina los caracteres que han quedado en el buffer de lectura. El primer parámetro indica el número de caracteres que se eliminan (en el caso expuesto, se eliminan el máximo número posible, que es INT_MAX). El segundo parámetro indica hasta que caracter se elimina, es decir, en el caso expuesto, elimina los caracteres del buffer hasta que llegue a un \n. Eso quiere decir, que elimina, o INT_MAX caracteres o hasta que llegue al caracter delimitador.

Sobre el funcionamiento en Visual C++, puede ser distinto, porque el Visual C++ tiene añadidos sobre el C++ estándar en ciertas cosas (no es un bug del Dev C++, o eso creo. Además, el Dev C++ usa un compilador externo, que puede ser el MinGW u otro, mientras que el Visual usa uno propio creado por Microsoft).

Saludos y espero que haya quedado algo claro.
  #7 (permalink)  
Antiguo 20/06/2012, 17:00
 
Fecha de Ingreso: julio-2011
Ubicación: Zapopan, Jal. MX
Mensajes: 316
Antigüedad: 13 años, 4 meses
Puntos: 32
Respuesta: Ciclo salta cin al presionar un NO NÚMERO con variable INT

Excelente explicación @alexg88, muy bien entendido :), gracias.

Etiquetas: cin, int, presionar, salta, variables, ciclos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:33.