En Windows si, pero Linux no =(

Iniciado por Morringos, 6 Septiembre 2011, 04:27 AM

0 Miembros y 1 Visitante están viendo este tema.

Morringos

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.


#include <stdio.h>





int main (int argc, char **argv){



double a = 0.0;



printf("Ahora imprimiremos el mensaje\n");



do{

printf("\nPor favor ingrese el numero nuevamente:\n");

fflush(stdin);



}while((scanf("%lf",&a)) == 0.0);



return 0;

}


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.

rir3760

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:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   double a;
   int ch;
   
   puts("Ahora imprimiremos el mensaje");
   
   while (scanf("%lf", &a) != 1){
      puts("Por favor ingrese el numero nuevamente:");
      while ((ch = getchar()) != EOF && ch != '\n')
         ;
   }
   printf("Numero: %f\n", a);
   
   return EXIT_SUCCESS;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Eternal Idol

scanf suele dejar basura en el buffer, es mejor usar fgets con stdin + sscanf, ejemplo:


char line[80];
do
{
printf("\nPor favor ingrese el numero nuevamente:\n");
fgets(line, sizeof(line), stdin);
sscanf(line, "%lf", &a);
}while(a);
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Morringos

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.

Eternal Idol

¿Cual era el problema exactamente? Solo lo probe en Windows pero fgets no deberia nunca provocar el mismo problema que scanf.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón