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)
| | |-+  Duda sobre scanf
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre scanf  (Leído 2,017 veces)
UsuarioZ

Desconectado Desconectado

Mensajes: 64


Ver Perfil
Duda sobre scanf
« en: 16 Noviembre 2019, 02:12 am »

Si pido un entero (lo especifico como %d) e ingreso una letra o algo que no sea un entero empieza como una recursion infinita.

¿Como puedo evitar esto en C?


« Última modificación: 16 Noviembre 2019, 03:19 am por UsuarioZ » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Duda sobre scanf
« Respuesta #1 en: 16 Noviembre 2019, 03:27 am »

Si no estás seguro del tipo de dato que va a introducir el usuario por teclado deberías usar la función <fgets()> y almacenar la entrada en un <char[]> para después validarlo tú internamente.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
ThunderCls


Desconectado Desconectado

Mensajes: 455


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Duda sobre scanf
« Respuesta #2 en: 18 Noviembre 2019, 01:29 am »

Para entender cual es el problema primero debes entender como funciona scanf. Esta funcion trabaja con un buffer de entrada o lo que es lo mismo un espacio en memoria de donde obtendra su contenido. Dicho buffer puede provenir de teclado, fichero, pipe, etc (stdin). Luego la funcion scanf intenta leer el buffer segun le especificas en el formato y una vez lee satisfactoriamente, el contenido del buffer leido es consumido. El problema viene cuando scanf no es capaz de leer el buffer como le haz indicado, entonces la funcion falla y el contenido del buffer se queda intacto. En tu caso le dices a scanf que debe leer un entero "%d" pero esta falla al encontrarse con un caracter, por lo que la funcion regresa sin haber modificado el buffer de entrada. Ahora ese caracter estara en ese buffer hasta que "alguien" lo elimine o se limpie el buffer por completo, lo que hace que tu scanf se siga llamando indefinidamente.
Luego de esta teoria, la solucion al problema se reduce a simplemente asegurarte que el buffer es limpiado si tu scanf falla para evitar un loop infinito. Una posible solucion seria:

Código
  1. #define ENTER '\n'
  2. #define CORRECT_INPUT_FLAG 2
  3. char ret = '\0';
  4. int number = 0;
  5.  
  6. if(scanf("%d%c", &number, &ret) != CORRECT_INPUT_FLAG || ret != ENTER)
  7. {
  8.    printf("Entrada invalida\n");
  9.    while (getchar() != ENTER) { } // limpia el buffer de caracteres invalidos
  10. }

Por otra parte scanf es inseguro, impredecible y dificil de manejar, una mejor solucion seria usar fgets()/getline() y sscanf() si necesitas parsear el contenido a variables.
Saludos
En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con scanf
Programación C/C++
Caster 3 3,975 Último mensaje 29 Septiembre 2012, 13:01 pm
por Caster
Pregunta de C scanf
Programación C/C++
g0rg3d3l4s3lv4 3 2,501 Último mensaje 15 Marzo 2013, 04:21 am
por g0rg3d3l4s3lv4
scanf y gets « 1 2 »
Programación C/C++
m@o_614 16 7,782 Último mensaje 21 Julio 2013, 19:29 pm
por rir3760
sustituir scanf « 1 2 »
Programación C/C++
m@o_614 11 6,605 Último mensaje 17 Octubre 2013, 17:59 pm
por Eternal Idol
problema scanf
Programación C/C++
pMV2ere 4 2,973 Último mensaje 1 Noviembre 2013, 08:44 am
por vangodp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines