Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: dalberto9410 en 26 Marzo 2013, 04:56 am



Título: Limpiar Buffer en Linux (estructuras)
Publicado por: dalberto9410 en 26 Marzo 2013, 04:56 am
Hola!
hace unos días que comenze a programar en C y he llegado a la parte de estructuras. Antes limpiaba el buffer utilizando

Código:
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..

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


Título: Re: Limpiar Buffer en Linux (estructuras)
Publicado por: avesudra en 26 Marzo 2013, 13:03 pm
¿Porqué dices que no puedes usar scanf directamente? Es exactamente lo mismo:
Código
  1. #include<stdio.h>
  2. struct contacto
  3. {
  4.    char nombre[40],direccion[80];
  5.    int edad;
  6.    long telefono;
  7. };
  8. typedef struct contacto cont;
  9. int main (void)
  10. {
  11.    cont c1;
  12.    printf("Ingrese el nombre\n");
  13.    scanf("%s",c1.nombre);
  14.    printf("%s\n",c1.nombre);
  15.    return 0;
  16. }
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:
Código
  1. #include<stdio.h>
  2. struct contacto
  3. {
  4.    char nombre[40],direccion[80];
  5.    int edad;
  6.    long telefono;
  7. };
  8. typedef struct contacto cont;
  9. int main (void)
  10. {
  11.    cont c1;
  12.    printf("Ingrese el nombre\n");
  13.    fgets(c1.nombre,40,stdin);
  14.    printf("%s\n",c1.nombre);
  15.    return 0;
  16. }
A esto me refiero con respecto al gets:
(http://img268.imageshack.us/img268/9741/capturadepantallade2013p.png)


Título: Re: Limpiar Buffer en Linux (estructuras)
Publicado por: dalberto9410 en 26 Marzo 2013, 15:53 pm
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! :)


Título: Re: Limpiar Buffer en Linux (estructuras)
Publicado por: avesudra en 26 Marzo 2013, 16:01 pm
Con fgets no debería salirte. El prototipo de fgets es este:
Código
  1. 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.


Título: Re: Limpiar Buffer en Linux (estructuras)
Publicado por: dalberto9410 en 26 Marzo 2013, 16:19 pm
 :silbar: si tienes razón estaba haciendo algo mal  xd y  :silbar:
 Gracias de nuevo avesudra


Título: Re: Limpiar Buffer en Linux (estructuras)
Publicado por: dalberto9410 en 26 Marzo 2013, 16:52 pm
Y como limpiar el buffer ? xd
Código:
#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


Título: Re: Limpiar Buffer en Linux (estructuras)
Publicado por: avesudra en 26 Marzo 2013, 17:06 pm
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.


Título: Re: Limpiar Buffer en Linux (estructuras)
Publicado por: dalberto9410 en 26 Marzo 2013, 17:25 pm
ah bueno vale ! ahora si puedo seguir .....
grax :D