elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  En Windows si, pero Linux no =(
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: En Windows si, pero Linux no =(  (Leído 4,046 veces)
Morringos

Desconectado Desconectado

Mensajes: 9


Ver Perfil
En Windows si, pero Linux no =(
« 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.


« Última modificación: 6 Septiembre 2011, 04:30 am por Morringos » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: En Windows si, pero Linux no =(
« Respuesta #1 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


En línea

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
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: En Windows si, pero Linux no =(
« Respuesta #2 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);
En línea

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

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: En Windows si, pero Linux no =(
« Respuesta #3 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.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.935


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: En Windows si, pero Linux no =(
« Respuesta #4 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.
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Funciona en Windows, pero no en linux... « 1 2 »
Programación C/C++
dgg006 10 6,242 Último mensaje 2 Junio 2011, 17:37 pm
por dakomt
Ayudaa! Tengo windows con linux en un note! Pero el wifi en windows no pesca !!
GNU/Linux
cryp70n1c 3 2,262 Último mensaje 11 Noviembre 2014, 22:31 pm
por cryp70n1c
cambiar mi mac como en linux pero en windows
Redes
Borito30 2 2,360 Último mensaje 2 Febrero 2017, 15:17 pm
por simorg
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines