Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: caronte en Junio 12, 2012, 07:33:26 pm

Título: Programa que no se detiene en un scanf
Publicado por: caronte en Junio 12, 2012, 07:33:26 pm

    Hola a tod@s

     ALguien sabe porque en el ultimo bloque de codigo que pongo a continuacion, el programa no se detiene en el ultimo scanf ??


             void actualizarnum (void)
    {
        int cnt =1;
        int numero;
        int sorteos;
        char opcion;
       
        printf( "\n¿Cuantos sorteos desea cargar?\n");
        scanf ("%d", &sorteos);
        fflush(stdin);
        sorteos = sorteos * 5;
                        while (cnt<=sorteos)
                    {
                       
                        printf("\nIntroduce numero: ");
                        scanf("%d", &numero);
                        fflush(stdin);
                        sucesos_favorables_num[numero] += 1;
                        cnt++;
                    }
                   
                    {
                    printf ("\n¿Guardar datos? (S/N): ");
                    scanf ("%c", &opcion);
                    fflush (stdin);
                }
                   
                             
                           
        }   
Título: Re:Programa que no se detiene en un scanf
Publicado por: piou en Junio 12, 2012, 07:35:21 pm
Prueba a poner el fflush(stdin) ANTES del scanf, así te quitará lo que halla en ese buffer antes de pedir entrada, por si acaso.
Título: Re:Programa que no se detiene en un scanf
Publicado por: caronte en Junio 12, 2012, 07:44:35 pm

    Probado, pero... sigue igual. No se detiene en el ultimo scanf.

  Alguna sugerencia?
Título: Re:Programa que no se detiene en un scanf
Publicado por: JAG en Junio 12, 2012, 08:00:48 pm
Pon esto tras el scanf
while(getchar()!='\n');
Título: Re:Programa que no se detiene en un scanf
Publicado por: caronte en Junio 12, 2012, 08:10:09 pm

     OK!!
Perfecto, de momento se detiene. Voy a comprobar que si guarda correctamente los datos en la variable.

   ¿Por que aqui no se detuvo como en otro scanf cual quiera?
¿Porque?
Citar
while(getchar()!='\n');

  Gracias de antemano!
Título: Re:Programa que no se detiene en un scanf
Publicado por: JAG en Junio 12, 2012, 08:14:02 pm

     OK!!
Perfecto, de momento se detiene. Voy a comprobar que si guarda correctamente los datos en la variable.

   ¿Por que aqui no se detuvo como en otro scanf cual quiera?
¿Porque?
Citar
while(getchar()!='\n');

  Gracias de antemano!


Porque creo que tomó el \n del anterior scanf en este y por eso no se detuvo... Creo que es eso... Es bueno poner lo que te he comentado siempre después de un scanf... te ahorrará calentamientos de cabeza... yo lo suelo poner...
Título: Re:Programa que no se detiene en un scanf
Publicado por: caronte en Junio 12, 2012, 08:25:15 pm


          Jag,
disculpa la ignorancia, tengo mucha teoria y poca practica.

  Hasta ahora en todos los ejemplos de codigo que he visto y escrito siempre coloco un: fflush(stdin) despues de cada scanf.
  Creia que con eso bastaba para limpiar el buffer y que hiciera la correspondiente pausa hasta introducir el dato y pulsar enter.....

     Incluso, siguiendo el consejo de Piou, antepuse el fflush al scanf de la discordia....  y nada....

        :-\ :-\ ...
Título: Re:Programa que no se detiene en un scanf
Publicado por: JAG en Junio 12, 2012, 08:28:40 pm
No pasa nada... aquí estamos para aprender entre todos... verás, por lo que me enseñaron en la universidad y por la "experiencia" que tengo en C/C++ la estructura que suelo seguir cuando hay entrada y salida es la siguiente:


printf...
fflush(stdout);
scanf...
while(getchar()!='\n');


con la última linea lo que hacemos es esperar hasta que el usuario introduzca un \n, es decir, hasta que pulse enter... hasta ahora me ha ido bien...
Título: Re:Programa que no se detiene en un scanf
Publicado por: dreams_eater en Junio 12, 2012, 10:05:39 pm
¿Porque?
while(getchar()!='\n');

lo que hace es :
char tecla = getchar();
while(tecla!='\n'){tecla = getchar();}

Esto es consumir todos los caracteres del buffer hasta leer el caracter final.

prueba:
scanf ("%c\n", &opcion);

en vez de :
scanf ("%c", &opcion);
 while(getchar()!='\n');
Saludos!
Título: Re:Programa que no se detiene en un scanf
Publicado por: NuX en Junio 12, 2012, 10:22:04 pm
En c++ podéis probar a hacer un cin.sync y así liberáis el espacio en el buffer, aquí tenéis mas información.
http://www.cplusplus.com/reference/iostream/istream/sync/

La cosa seria hacer el cin.sync antes de esa petición:
cin.sync()
cout introduce una opcion
cin opcion

Un saludo
Título: Re:Programa que no se detiene en un scanf
Publicado por: Teyr en Junio 12, 2012, 10:50:19 pm
Nunca, nunca, nunca se debe usar fflush(stdin) es algo totalmente indefinido su funcionamiento ahora supongo que aprendiste por las malas cuando no te flusheo stdin.

Desde ahora siempre getchar hasta \n y no tendras ningun problema
Título: Re:Programa que no se detiene en un scanf
Publicado por: JAG en Junio 12, 2012, 10:56:26 pm

Esto es consumir todos los caracteres del buffer hasta leer el caracter final.


Para eso mismo lo hago... así nunca tendremos problemas con este aspecto...
Título: Re:Programa que no se detiene en un scanf
Publicado por: caronte en Junio 13, 2012, 03:48:54 am


 
¿Porque?
while(getchar()!='\n');

lo que hace es :
char tecla = getchar();
while(tecla!='\n'){tecla = getchar();}

Esto es consumir todos los caracteres del buffer hasta leer el caracter final.

prueba:
scanf ("%c\n", &opcion);

en vez de :
scanf ("%c", &opcion);
 while(getchar()!='\n');
Saludos!
FUnciona!  Por que el salto de linea?
  Y tambien el while:

Esto es consumir todos los caracteres del buffer hasta leer el caracter final.


Para eso mismo lo hago... así nunca tendremos problemas con este aspecto...


 Gracias a todos. Solucionado
Título: Re:Programa que no se detiene en un scanf
Publicado por: dreams_eater en Junio 13, 2012, 04:53:42 am
Como Teyr: Yo aprendí por las malas a no flushear descriptores de archivo que son dispositivos porque a velocidades superiores de 100 miliseg causa estragos, en vez de eso consumo los caracteres.

El salto de linea en el scanf, es porque puedes meter cosas extra para informarle que debe ignorar.
Más bien es un "hack", que lo sacas leyendo sobre scanf o lo encuentras en http://c-faq.com/questions.html

Hola @Nux: encontraste una solucion elegante!