elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Loops infinitos en input erroneos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Loops infinitos en input erroneos  (Leído 4,042 veces)
RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Loops infinitos en input erroneos
« en: 31 Marzo 2011, 00:04 am »

Hola que tal.

Pues me surgió esta duda, digamos que quiero pedir un dato entero, y necesito que sea entero entonces hago lo siguiente:

Código
  1. int number
  2. cin >> number;

para comprobar si es un entero puedo hacerlo con:

Código
  1. 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):

Código
  1. while(/*condicion*/){
  2.    cin >> number;
  3.    if(cin.fail()){/*ERROR*/}
  4. }

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 Desconectado

Mensajes: 823



Ver Perfil
Re: Loops infinitos en input erroneos
« Respuesta #1 en: 31 Marzo 2011, 00:10 am »

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)
Código
  1. 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 Desconectado

Mensajes: 19


Ver Perfil
Re: Loops infinitos en input erroneos
« Respuesta #2 en: 31 Marzo 2011, 01:06 am »

Hola que tal.

Pues me surgió esta duda, digamos que quiero pedir un dato entero, y necesito que sea entero entonces hago lo siguiente:

Código
  1. int number
  2. cin >> number;

para comprobar si es un entero puedo hacerlo con:

Código
  1. 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):

Código
  1. while(/*condicion*/){
  2.    cin >> number;
  3.    if(cin.fail()){/*ERROR*/}
  4. }

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 Desconectado

Mensajes: 28


/*Nada*/


Ver Perfil WWW
Re: Loops infinitos en input erroneos
« Respuesta #3 en: 31 Marzo 2011, 02:23 am »

Probaste creando un int (c) o un bool (c++) y con un do while?

Digo...


Código
  1. bool error;
  2.  
  3. do
  4. {
  5.    error=false;
  6.  
  7.    cin >> number;
  8.    if(cin.fail()){error=true;}
  9.  
  10.  
  11. }while(error==true;)
  12.  

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 Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: Loops infinitos en input erroneos
« Respuesta #4 en: 1 Abril 2011, 00:28 am »

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

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Loops infinitos en input erroneos
« Respuesta #5 en: 1 Abril 2011, 11:01 am »

Tal como te dijo samael, leer como cadena y luego extraer el número (de la forma que sea) parece ser la opción más viable. Es un tema que se ha tratado últimamente por aquí:

Entre otras: leer un char[] y usar sprintf o usar sstreams (string streams)

http://foro.elhacker.net/programacion_cc/referencia_de_un_char_en_una_funcionakai_pasate_por_favor_que_modificadoxd-t322721.0.html

EDIT: en realidad, en vez de sprintf, sería scanf, con sprintf escribes en la cadena, con scanf lees.
« Última modificación: 1 Abril 2011, 22:17 pm por Akai » En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: Loops infinitos en input erroneos
« Respuesta #6 en: 1 Abril 2011, 22:11 pm »

Tal como te dijo samael, leer como cadena y luego extraer el número (de la forma que sea) parece ser la opción más viable. Es un tema que se ha tratado últimamente por aquí:

Entre otras: leer un char[] y usar sprintf o usar sstreams (string streams)

http://foro.elhacker.net/programacion_cc/referencia_de_un_char_en_una_funcionakai_pasate_por_favor_que_modificadoxd-t322721.0.html

Bien gracias por la respuesta! habia visto el hilo, pero no lo habia leido en detalle.

Saludos
En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Loops infinitos en input erroneos
« Respuesta #7 en: 1 Abril 2011, 22:17 pm »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Fruity Loops en Español
Multimedia
Джордж 6 21,568 Último mensaje 23 Marzo 2007, 00:02 am
por Джордж
arreglos infinitos
Java
brian_e 2 12,061 Último mensaje 9 Marzo 2009, 05:08 am
por brian_e
Busqueda de sitio - samples ,loops etc.
Dudas Generales
Zorronde 2 2,216 Último mensaje 4 Marzo 2013, 13:58 pm
por Zorronde
Duda con LOOPS
Programación C/C++
pablovg9 5 1,893 Último mensaje 1 Agosto 2015, 23:08 pm
por pablovg9
Bucles infinitos.
Programación General
kondrag_X1 2 1,735 Último mensaje 3 Enero 2016, 22:13 pm
por Sr_Malweriks
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines