C/Visual C - Bucle que se salta un gets

 
Vista:

Bucle que se salta un gets

Publicado por txoco (7 intervenciones) el 22/05/2009 14:36:00
Hola a todos;

Hice este sencillo programa para practicar la introducción de datos en una estructura pero resulta que, a pesar de no dar errores de compilación, al ejecutarse el programa se salta el gets que recoge persona[1].nombre y persona[2].nombre. ¿Alguien sabe porqué?

He de decir que con el compilador de turbo c++ funciona bien pero con gcc no.
gcc avisa diciendo que no debería utilizar gets.

codigo:
#include <stdio.h>

int main()
{
struct datos
{
char nombre [20];
char apellidos [30];
int edad;
};

struct datos persona[3];

int i;

printf ("INTRODUCE DATOS: ");
for (i=0;i<3;i++)
{
printf(" NOMBRE: ");
gets (persona[i].nombre);
fflush (stdin);
printf(" APELLIDOS: ");
gets (persona[i].apellidos);
fflush (stdin);
printf(" EDAD: ");
scanf ("%i", &persona[i].edad);
fflush(stdin);
}

int a;
for (a=0;a<3;a++)
{
printf("%s %s tiene %i años",persona[a].nombre, persona[a].apellidos,persona[a].edad);
}
return 0;
}

Un Saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 11
Ha aumentado su posición en 5 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

RE:Bucle que se salta un gets

Publicado por apis (318 intervenciones) el 23/05/2009 05:28:15
copie el programa y lo puse asi y funciono
#include <stdio.h>
struct datos
{
char nombre [20];
char apellidos [30];
int edad;
};

int main()
{
struct datos persona[3];
int i;
int a;
printf ("INTRODUCE DATOS: ");
for (i=0;i<3;i++)
{
printf(" NOMBRE: ");
gets (persona[i].nombre);
fflush (stdin);
printf(" APELLIDOS: ");
gets (persona[i].apellidos);
fflush (stdin);
printf(" EDAD: ");
scanf ("%i", &persona[i].edad);
fflush(stdin);
}

for (a=0;a<3;a++)
{
printf("%s %s tiene %i años",persona[a].nombre, persona[a].apellidos,persona[a].edad);
}
getch();
return 0;
}

la estructura afuera del main, todas las variables al inicio en el c++ de builder si marcaba errores al compilar en el orden que lo tenias

lo del gcc a lo mejor tienen otra funcion para obtener cadenas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bucle que se salta un gets

Publicado por Tom (619 intervenciones) el 24/05/2009 17:20:35
Si funciona, ya sabes :-)

No creo que tu problema estuviera en el gets (por cierto, usa fgets() mejor) sino en el scanf().

El scanf no lee el caracter de nueva línea, así que se queda en el buffer y el siguiente gets lo toma como entrada y devuelve cadena vacía.

Creo que el flush() necesario es el que haces después del scanf()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bucle que se salta un gets

Publicado por txoco (7 intervenciones) el 29/05/2009 22:02:31
Muchas gracias a los dos, era cuestión del buffer.


Por cierto intenté usar fgets() pero este mete un salto de línea al final por lo que no me vale para guardar los datos que introduzca alineados en un archivo de texto.


Lo intentaré con scanf("%[^ ]s", &loquesea).


Un Saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bucle que se salta un gets

Publicado por martin (1 intervención) el 22/06/2010 01:10:14
hola , bueno es la primera vez que ando por aqui,a mi me paso y lo resolvi asi poniendo primero el fflush que limpia el buffer del teclado , despues cargas la varible. esto pasa en grl con los char.suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Bucle que se salta un gets

Publicado por Kenshin (1 intervención) el 10/07/2010 00:34:40
Es facil compañero, se salta la instruccion gets(); porque anteriormente usaste la funcion scanf(); y por tanto algunos caracteres se quedaron en el flujo de datos de stdin, solo basta con limpiar el flujo de datos antes de usar gets(); despues de haber usado scanf();

Como recomendacion, no utilices fflush(); para limpiar el flujo de datos de stdin, tu mismo puedes crear una funcion muy sencilla de limpieza, hay te va el prototipo y la funcion.

void limpieza ( void );

void limpieza ( void )
{
//Se crea un arreglo, donde almacenaremos los caracteres que se quedaron
//en el buffer del flujo de entrada de stdin
char arreglo [ 100 ];

//Posteriormente con gets(); atraparemos esos caracteres y los almacenaramos
//en el arreglo " arreglo "
gets ( arreglo );
}

Y ya, con esta pequeña funcion, limpiaremos el flujo de datos de stdin =P!

Intentalo y te funcionara correctamente!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar