Ver Mensaje Individual
  #4 (permalink)  
Antiguo 29/05/2012, 05:24
oldesebas
 
Fecha de Ingreso: mayo-2012
Mensajes: 7
Antigüedad: 12 años, 5 meses
Puntos: 0
Respuesta: Cómo evitar que el 'scanf' lea los datos introducidos antes?

Cita:
Iniciado por Fw190 Ver Mensaje
Ocurre que accion la lees al final del bucle do, mientras que al principio de este bucle haces accion = ' ', con lo cual, introduzcas lo que introduzcas, accion va a valer ' ' de cara a las comparaciones que estás haciendo. La solución es pedir accion al principio del bucle.
No, ese no es el problema, ya que el 'acción==0' no es una asignación, de hecho está ahí por error, pero no modifica el programa.

El 'scanf' está al final del do por que de tanto marearlo se ha quedado ahí, pero al principio lo tenía arriba y el resultado no cambia, pues el problema es que en 'accion' me carga datos que he introducido en los subprogramas en lugar de los que voy a introducir.

Me he acabado apañando con un rudimentario 'if' en el 'printf' que no me evita que el 'scanf' me lea los datos residuales, pero si evita que se imprima en pantalla el primer bucle, así me ha quedado:

Código C++:
Ver original
  1. int main (){
  2.  
  3.     char accion = ' ';
  4.  
  5.     do{
  6.  
  7.         if (accion == 'e' || accion == 'E'){
  8.  
  9.             entrar_vehiculo();
  10.  
  11.         } else if (accion == 's' || accion == 'S'){
  12.  
  13.             salir_vehiculo();
  14.  
  15.         } else if(accion == 'o' || accion == 'O'){
  16.  
  17.             printf("\n\n");
  18.             imprimir_parking();
  19.  
  20.         }
  21.  
  22.         if(accion != 'e' && accion != 'E' && accion != 's' && accion != 'S' && accion != 'o' && accion != 'O' && accion != 'F' && accion != 'f' ){
  23.             printf("\nIndique acción a realizar (Si entra vehiculo pulse 'E', si sale vehiculo pulse 'S', si desea observar el estado del parking pulse 'O', si desea finalizar el programa pulse 'F'): ");
  24.         }
  25.  
  26.         scanf("%c", &accion);
  27.  
  28.     } while (accion!= 'f' && accion != 'F');
  29.  
  30.     return 0;
  31. }

En otro foro me han dado una solución mejor que directamente limpia los datos de manera que el programa solo escanee una vez:

Código C++:
Ver original
  1. ...
  2.  
  3. flush_stdin()
  4. {
  5.    int ch;
  6.    while( (ch = getchar()) != '\n' && ch != EOF );
  7. }
  8.  
  9. ...
  10.  
  11.    scanf("%d", &a );
  12.    flush_stdin();
  13. ...
  14.    scanf("%d", &b );
  15.    flush_stdin();
  16. ...

Gracias.