Dev - C++ - Comportamiento extraño del scanf

 
Vista:
sin imagen de perfil

Comportamiento extraño del scanf

Publicado por Raúl (3 intervenciones) el 18/11/2016 13:50:09
Soy novato en lenguaje c y en programas de consola, hice este programa sencillo y noto que el scanf tiene un comportamiento raro cuando el dato que solicito es un char, el programa debe pedir dos números mostrar la suma y decir al usuario presiona cualquier tecla para hacer otra suma y s para salir, hago el recursivo mediante un do while pero cuando compilo y ejecuto el programa me pide los números y olímpicamente se salta el scanf de retorno/salida, se cicla medio raro, hice una prueba, cambio el dato char por int y digo al usuario presiona cualquier numero para ejecutar de nuevo y 3 para salir, no hay problema funciona muy bien entonces me hace pensar que el comportamiento errático lo genera el tipo char en conjunto con el scanf, ¿alguien que me oriente sobre lo que está pasando?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
int main()
{
    system("cls");
    int h,s;
    char a;
    do{
        scanf("%d", &h);
        scanf("%d", &s);
        printf("suma %i \n",h+s);
        printf("ejecutar de nuevo cualquier tecla, salir presiona s \n");
        scanf("%c", &a);
        system("cls");
    } while (a !='s');
        exit (0);
        return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Comportamiento extraño del scanf

Publicado por agustin (522 intervenciones) el 18/11/2016 15:10:15
Primero, eso no es recursivo para nada.
Segundo, tu problema es que en el buffer de entrada hay basura y por eso cuando solicitas el carácter lo lee del buffer y sigue.
Coloca un getchar() después de solicitar el segundo numero. Otra opción seria crearte una función que limpie el buffer entero cómo:
1
2
3
4
5
6
7
void LimpiarBuffer()
{
    char a;
    do{
        a=getchar();
    }while(a != '\n' && !feof(stdin));
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

Comportamiento extraño del scanf

Publicado por Raúl (3 intervenciones) el 18/11/2016 15:30:17
muchas gracias por tu respuesta es directa y clara ya entiendo lo que pasa, leyendo un poco acerca del buffer de entrada encontré que una manera de limpiarlo es con fflush voy a intentar con esta solución y tienes razón no es recursivo simplemente se repite por la instrucción do gracias por la aclaración ^ ^
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 661
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Comportamiento extraño del scanf

Publicado por agustin (522 intervenciones) el 18/11/2016 23:13:54
Usar fflush con stdin esta desaconsejado ya que fflush es para limpiar buffer de salida y su comportamiento con buffer de entrada no está definido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Comportamiento extraño del scanf

Publicado por Raúl (3 intervenciones) el 20/11/2016 19:20:23
ok anotado gracias por el comentario
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar