Limpiar Buffer en Linux (estructuras)

Iniciado por dalberto9410, 26 Marzo 2013, 04:56 AM

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

dalberto9410

Hola!
hace unos días que comenze a programar en C y he llegado a la parte de estructuras. Antes limpiaba el buffer utilizando

while(getchar()!='\n');

después de leer el dato con scanf, pero ahora que he llegado a estructuras, al parecer no puedo usar scanf directamente y se usa el gets(), bien con scanf el código antes mostrado para limpiar el buffer funcionaba perfecto, pero ahora con el gets no! a la hora que ingreso un nombre y doy enter queda en una linea nueva y tengo que dar otro enter para que recien pase a la impresion del nombre cosa que no debería pasar ... aca mi código..


#include<stdio.h>
struct contacto{
char nombre[40],direccion[80];
int edad;
long telefono;
};
typedef struct contacto cont;
int main (void){
cont c1;
printf("Ingrese el nombre\n");
gets(c1.nombre);
printf("%s\n",c1.nombre);
return 0;
}
Como podría limpiar el buffer entonces?

Saludos y gracias de antemano ! ;D

avesudra

#1
¿Porqué dices que no puedes usar scanf directamente? Es exactamente lo mismo:
#include<stdio.h>
struct contacto
{
   char nombre[40],direccion[80];
   int edad;
   long telefono;
};
typedef struct contacto cont;
int main (void)
{
   cont c1;
   printf("Ingrese el nombre\n");
   scanf("%s",c1.nombre);
   printf("%s\n",c1.nombre);
   return 0;
}

En cuanto al gets , no deberías usarlo ya que lee una línea, que puede desbordar el array que le pasas como parámetro, al leer más caracteres de la cuenta de los que puede tener el array, así que para este caso, mi humilde opinión es usar fgets:
#include<stdio.h>
struct contacto
{
   char nombre[40],direccion[80];
   int edad;
   long telefono;
};
typedef struct contacto cont;
int main (void)
{
   cont c1;
   printf("Ingrese el nombre\n");
   fgets(c1.nombre,40,stdin);
   printf("%s\n",c1.nombre);
   return 0;
}

A esto me refiero con respecto al gets:
Regístrate en

dalberto9410

gracias avesudra había visto un tutorial de C donde decía que no se podía hacer directamente... bueno y me la creí gracias por la respuesta, lo que si no entiendo es el fgets como funciona este? ya que si me paso de 40 caracteres = sale el error de stack smashing :/

Gracias! :)

avesudra

Con fgets no debería salirte. El prototipo de fgets es este:
char * fgets ( char * str, int num, FILE * stream );
Donde str es un puntero donde se van a copiar num-1 carácteres , desde el archivo que le indiques, en este caso es el estándar de entrada.
Regístrate en

dalberto9410

 :silbar: si tienes razón estaba haciendo algo mal  xd y  :silbar:
Gracias de nuevo avesudra

dalberto9410

Y como limpiar el buffer ? xd

#include<stdio.h>
struct contacto{
char nombre[40],direccion[80];
int edad;
int telefono;
};
typedef struct contacto cont;
int main (void){
cont c1;
printf("Ingrese el nombre\n");
fgets(c1.nombre,40,stdin);
while(getchar()!='\n');
printf("Ingrese direccion\n");
fgets(c1.direccion,80,stdin);
while(getchar()!='\n');
printf("Ingrese edad\n");
scanf("%d",&c1.edad);
while(getchar()!='\n');
printf("Ingrese telefono\n");
scanf("%d",&c1.telefono);
while(getchar()!='\n');
printf("----------------------------\n");
printf("Nombre: %s\n Direccion: %s\n Edad %d\n Telefono %d \n",
c1.nombre,c1.direccion,c1.edad,c1.telefono);
//printf("%s\n",c1.nombre);
return 0;
}



lo estuve haciendo así y esta mal por que tengo que dar doble enter o estoy usando mal el while(getchar!='\n'); ???  :( como podría mejorar el code
graax de antemano  ;D

avesudra

Ahora mismo pasa porque no es necesario limpiar el buffer, dado que no hay basura en stdin, es una de las buenas cosas que tiene fgets... Úsalo solo cuando veas que se salta un scanf o algo.
Regístrate en

dalberto9410

ah bueno vale ! ahora si puedo seguir .....
grax :D