Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Morringos en 6 Septiembre 2011, 04:27 am



Título: En Windows si, pero Linux no =(
Publicado por: Morringos en 6 Septiembre 2011, 04:27 am
Buenas a todos brothers, resulta ser que el día de ayer, traté de hacer un programa sencillo que te pidiera un número, pero que te estará dsplegando el mensaje donde pide que el usuario ingrese el número en dado caso de que el usuario haya ingresado algo inválido.

Lo raro es que con Windows (Eclipse ó CodeBlocks y MinGW) me funciona perfecto, pero al compilarlo en Linux (CodeBlocks o CodeLite) el programa ya no funciona, se me cicla. Les muestro el código para ver si me pueden dar una idea del error. O sea, si en Windows me vuelve a aparecer el mensaje y espera a que el usuario teclee de nuevo, en Linux me lo vuelve a mostrar pero de forma acelerada, sin dejar al usuario ingresar de nuevo.

Código
  1. #include <stdio.h>
  2.  
  3.  
  4.  
  5.  
  6.  
  7. int main (int argc, char **argv){
  8.  
  9.  
  10.  
  11. double a = 0.0;
  12.  
  13.  
  14.  
  15. printf("Ahora imprimiremos el mensaje\n");
  16.  
  17.  
  18.  
  19. do{
  20.  
  21. printf("\nPor favor ingrese el numero nuevamente:\n");
  22.  
  23. fflush(stdin);
  24.  
  25.  
  26.  
  27. }while((scanf("%lf",&a)) == 0.0);
  28.  
  29.  
  30.  
  31. return 0;
  32.  
  33. }
  34.  

Intenté poniendo la función "fflush" para ver si me solucionaba algo, pero al parecer no.
Bueno, espero y me haya dado a entender.
Saludos.


Título: Re: En Windows si, pero Linux no =(
Publicado por: rir3760 en 6 Septiembre 2011, 04:56 am
La funcion "fflush" solo debes utilizarla con flujos de salida, "stdin" es uno de entrada y como extension (la forma "fflush(stdin)") usualmente solo disponible en compiladores para MS Windows. Tambien debes comparar contra 0 ya que el valor de retorno de scanf es de tipo "int".

Para evitar el comportamiento que mencionas basta con eliminar el resto de la linea despues de cada llamada a scanf. Por ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   double a;
  7.   int ch;
  8.  
  9.   puts("Ahora imprimiremos el mensaje");
  10.  
  11.   while (scanf("%lf", &a) != 1){
  12.      puts("Por favor ingrese el numero nuevamente:");
  13.      while ((ch = getchar()) != EOF && ch != '\n')
  14.         ;
  15.   }
  16.   printf("Numero: %f\n", a);
  17.  
  18.   return EXIT_SUCCESS;
  19. }

Un saludo


Título: Re: En Windows si, pero Linux no =(
Publicado por: Eternal Idol en 6 Septiembre 2011, 11:12 am
scanf suele dejar basura en el buffer, es mejor usar fgets con stdin + sscanf, ejemplo:

Código:
char line[80];
do
{
printf("\nPor favor ingrese el numero nuevamente:\n");
fgets(line, sizeof(line), stdin);
sscanf(line, "%lf", &a);
}while(a);


Título: Re: En Windows si, pero Linux no =(
Publicado por: Morringos en 10 Septiembre 2011, 22:01 pm
Muchas gracias a los dos por su ayuda, me fue de gran utilidad  ;D
En cuanto al código de Eternal Idol, no me funcionó su código, pero el de rir3760 me funcionó perfectamente.

Muchas gracias a los dos.
Saludos.


Título: Re: En Windows si, pero Linux no =(
Publicado por: Eternal Idol en 11 Septiembre 2011, 00:05 am
¿Cual era el problema exactamente? Solo lo probe en Windows pero fgets no deberia nunca provocar el mismo problema que scanf.