SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Perrero en Domingo 4 de Junio de 2006, 19:04

Título: Duda Con Este Codigo
Publicado por: Perrero en Domingo 4 de Junio de 2006, 19:04
Tengo un codigo el cual te pide ingresa un numero y luego un mensaje, de esta manera

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <windows.h>
  4.  
  5. typedef int integer;
  6. typedef char string[255];
  7.  
  8. int main()
  9. {
  10.     integer num;
  11.     string cadena;    
  12.     printf("Introduce un numero: ");
  13.     scanf("%i",&num);
  14.     printf("Introduce un mensaje: ");
  15.     fflush(stdout);
  16.     gets(cadena);      
  17.     printf("El numero introducido es %i",num);
  18.     printf("\nEl mensaje introducido fue %s\n\n",cadena);
  19.     system("pause");
  20.     return 0;
  21. }
  22.  
  23.  

primero e pide que meta un numero, cuando lo introduzco y le doy enter no me deja meter el mensaje xq el programa se termina y sale como mensaje "El numero introducido es...".

Pero si hago que primero me deje meter el mensaje y despues el numero, el programa va bien. A que se debe esto?... :hola:
Título: Re: Duda Con Este Codigo
Publicado por: robbie110487 en Domingo 4 de Junio de 2006, 21:07
Hola, ese codigo esta bien, el error esta cuando limpias el buffer de entrada, la sentencia correcta es
Código: Text
  1. fflush(stdin);
  2.  

el codigo deberia quedar asi:

Código: Text
  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. typedef int integer;
  5. typedef char string[255];
  6.  
  7. int main()
  8. {
  9.    integer num;
  10.    string cadena;
  11.    printf("Introduce un numero: ");
  12.    scanf("%i",&num);
  13.    printf("Introduce un mensaje: ");
  14.    fflush(stdin);
  15.    gets(cadena);
  16.    printf("El numero introducido es %i",num);
  17.    printf("\nEl mensaje introducido fue %s\n\n",cadena);
  18.    system("pause");
  19.    return 0;
  20. }
  21.  

Compilalo asi y veras que va de maravilla...

Un saludo  :hola:
Título: Re: Duda Con Este Codigo
Publicado por: Perrero en Domingo 4 de Junio de 2006, 23:21
pero xq el gets() no funciona de forma similar al scanf, xq tengo q limpiar el buffer cuando uso gets()?
Título: Re: Duda Con Este Codigo
Publicado por: robbie110487 en Lunes 5 de Junio de 2006, 01:03
La verdad no se, las unica diferencia que yo conozco entre scanf() y gets(), es que scanf() es entrada con formato:

Código: Text
  1. char *gets(char *cadena);
  2.  

Citar
Esta función lee caracteres desde el stream apuntado por stream stdin, en el array apuntado por cadena, hasta que se encuentre un final de fichero (EOF) o un carácter de línea nueva es leído. Cualquier carácter de línea nueva es descartado, y un carácter nulo es escrito inmediatamente después del último carácter leído en el array.



Código: Text
  1. int scanf(const char *formato, ...);
  2.  

Código: Text
  1. Esta función es equivalente a fscanf con el argumento stdin interpuesto antes de los argumentos a scanf.
  2.  

Citar
fscanf
Esta función recibe datos del stream apuntado por stream, bajo el control de la cadena apuntada por formato que especifica las secuencias de entrada permitadas y cómo han de ser convertidas para la asignación. Si hay argumentos insuficientes para el formato, el comportamiento no está definido. Si el formato termina mientras quedan argumentos, los argumentos restantes son evaluados (como siempre) pero ignorados. La función retorna control cuando el final de la cadena de formato es encontrado.

Fuente http://c.conclase.com (http://c.conclase.com)

Tmb see que scanf solo lee una cadena hasta que encuentra un espacio a diferencia de gets()...
 :comp:

Un saludo  :hola:
Título: Re: Duda Con Este Codigo
Publicado por: x.cyclop en Lunes 5 de Junio de 2006, 04:34
¿Cuál es la diferencia entre stdin y stdout del fflush()? :blink:
Título: Re: Duda Con Este Codigo
Publicado por: Geo en Lunes 5 de Junio de 2006, 05:45
stdin apunta a la entrada (lo que se lee, introducido por el usuario), stdout a la salida (lo que muestras por pantalla).

Saludos,
JJ (Geo).