Autor
|
Tema: Loops infinitos en input erroneos (Leído 4,360 veces)
|
RyogiShiki
Desconectado
Mensajes: 745
げんしけん - Hikkikomori FTW!!!
|
Hola que tal. Pues me surgió esta duda, digamos que quiero pedir un dato entero, y necesito que sea entero entonces hago lo siguiente: int number cin >> number;
para comprobar si es un entero puedo hacerlo con: if(cin.fail())
y lo puedo detectar sin problemas si lo que se ha ingresado no es un entero, el problema viene cuando por ejemplo en un menu con un loop while hago dicha comprobación (pongo un code de ejemplo que no necesariamente es de un menu, mi idea esta basada en ejemplos para exponer el problema general): while(/*condicion*/){ cin >> number; if(cin.fail()){/*ERROR*/} }
Pero allí está el problema, no importa que ciclo use (for, do-while, while, nisiquiera un asqueroso loop formado con un goto) Si la entrada no es la esperada el programa entrará a un loop infinito donde se presenta lo contenido en el condicional if. Este problema de loop infinito es muy común cuando se ingresan datos aun programa que no son los que el programa esperaba. Me preguntaba si existía una forma para evitar entrar en estos molestos loops. Y no necesarimente se presenta cuando la lectura y/o validación de datos está dentro de un loop. Gracias
|
|
« Última modificación: 31 Marzo 2011, 00:08 am por gankutsuo »
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
El problema, creo que es porque el flag fail se establece si se produce un error de lógica interna en el stream. Prueba con good negado (good está establecido si no hay ningún fallo, y cae si se presenta algún fallo) en vez de fail (que únicamente aparece con errores de lógica interna del stream) if(!cin.good())
EDIT: Añado, otra alternativa es usar badbit en vez de fail. Badbit comprueba los fallos en la operación de entrada / salida. good negado los comprueba todos (fail, badbit, eofbit), pero si no te interesa tanta información, usar únicamente badbit si no me equivoco debido al sueño en estos momentos debería darte la solución.
|
|
« Última modificación: 31 Marzo 2011, 00:17 am por Akai »
|
En línea
|
|
|
|
Samael.Black
Desconectado
Mensajes: 19
|
Hola que tal. Pues me surgió esta duda, digamos que quiero pedir un dato entero, y necesito que sea entero entonces hago lo siguiente: int number cin >> number;
para comprobar si es un entero puedo hacerlo con: if(cin.fail())
y lo puedo detectar sin problemas si lo que se ha ingresado no es un entero, el problema viene cuando por ejemplo en un menu con un loop while hago dicha comprobación (pongo un code de ejemplo que no necesariamente es de un menu, mi idea esta basada en ejemplos para exponer el problema general): while(/*condicion*/){ cin >> number; if(cin.fail()){/*ERROR*/} }
Pero allí está el problema, no importa que ciclo use (for, do-while, while, nisiquiera un asqueroso loop formado con un goto) Si la entrada no es la esperada el programa entrará a un loop infinito donde se presenta lo contenido en el condicional if. Este problema de loop infinito es muy común cuando se ingresan datos aun programa que no son los que el programa esperaba. Me preguntaba si existía una forma para evitar entrar en estos molestos loops. Y no necesarimente se presenta cuando la lectura y/o validación de datos está dentro de un loop. Gracias Yo cuando estuve aprendiendo a programar (aun no aprendo bien)... me tope con eso... lo que yo hacia para evitarlo... era crear una variable char (la cual almacenaría el numero introducido por el usuario) y le daba un carácter de 0 a esta variable (algo asi char variable[2] = "0"; ) entonces usando la funciona atoi(variable) transformaba el carácter introducido por el usuario a un numero... y ya nunca mas me volvió a pasar eso... claro no se si sea muy practico... hacer esto... pero me funciono después buscare otras soluciones... Pd: en caso de que el usuario introduce un carácter o cadena de caracteres... este por la función atoi... automáticamente tendría el valor de 0... (osea siempre manejarías números aunque se introdujeran caracteres)...
|
|
« Última modificación: 31 Marzo 2011, 01:10 am por Samael.Black »
|
En línea
|
|
|
|
mauriciodelos
Desconectado
Mensajes: 28
/*Nada*/
|
Probaste creando un int (c) o un bool (c++) y con un do while?
Digo...bool error; do { error=false; cin >> number; if(cin.fail()){error=true;} }while(error==true;)
Al empezar el bucle declararías la variable error como falsa para que no se genere un bucle infinito.
|
|
« Última modificación: 31 Marzo 2011, 02:30 am por mauriciodelos »
|
En línea
|
El fanatismo es la máxima estupidez humana.
|
|
|
RyogiShiki
Desconectado
Mensajes: 745
げんしけん - Hikkikomori FTW!!!
|
Que puedo decir:
@Akai: gracias por la rápida respuesta! pero debo decir que nada de esto me ha servido, no negar cin.good ni usando los bits, ni limpiando con cin.clear nada ha funcionado. Gracias igual por la colaboración, si se te ocurre algo más bien puedes compartirlo.
@mauriciodelos: esto tampoco ha funcionado me lleva al loop infinito siempre
@Samael.Black: esta parece ser la solución más viable, habia pensado en algo parecido antes de escribir este tema pero en mi mente todavía persistia la idea de la existencia de un método diferente para realizar esta tarea.
Gracias a todos! Ya saben, si surge algo avisen porfa!
Saludos
|
|
|
En línea
|
|
|
|
|
RyogiShiki
Desconectado
Mensajes: 745
げんしけん - Hikkikomori FTW!!!
|
Bien gracias por la respuesta! habia visto el hilo, pero no lo habia leido en detalle. Saludos
|
|
|
En línea
|
|
|
|
Akai
Desconectado
Mensajes: 823
|
Corrijo, Entre otras: leer un char[] y usar sprintf o usar sstreams (string streams)
NO, sprintf NO, quería decir scanf. sprintf te imprime algo en una cadena, lo que tu quieres es leer de la cadena. PD: he creído conveniente avisar del cambio añadiendo una respuesta al tema.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Fruity Loops en Español
Multimedia
|
Джордж
|
6
|
21,884
|
23 Marzo 2007, 00:02 am
por Джордж
|
|
|
arreglos infinitos
Java
|
brian_e
|
2
|
12,324
|
9 Marzo 2009, 05:08 am
por brian_e
|
|
|
Busqueda de sitio - samples ,loops etc.
Dudas Generales
|
Zorronde
|
2
|
2,497
|
4 Marzo 2013, 13:58 pm
por Zorronde
|
|
|
Duda con LOOPS
Programación C/C++
|
pablovg9
|
5
|
2,212
|
1 Agosto 2015, 23:08 pm
por pablovg9
|
|
|
Muchos loops, ayuda.
Programación General
|
Tachikomaia
|
0
|
916
|
19 Agosto 2024, 07:10 am
por Tachikomaia
|
|