Hack x Crack - Comunidad de Seguridad informática
Programación => C / C++ => Mensaje iniciado 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);
}
}
-
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.
-
Probado, pero... sigue igual. No se detiene en el ultimo scanf.
Alguna sugerencia?
-
Pon esto tras el scanf
while(getchar()!='\n');
-
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? while(getchar()!='\n');
Gracias de antemano!
-
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? 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...
-
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....
:-\ :-\ ...
-
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...
-
¿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!
-
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
-
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
-
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...
-
¿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
-
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!