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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Limpiar Buffer en Linux (estructuras)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Limpiar Buffer en Linux (estructuras)  (Leído 5,161 veces)
dalberto9410

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Limpiar Buffer en Linux (estructuras)
« 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


En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Limpiar Buffer en Linux (estructuras)
« Respuesta #1 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:


« Última modificación: 26 Marzo 2013, 13:11 pm por avesudra » En línea

Regístrate en
dalberto9410

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Limpiar Buffer en Linux (estructuras)
« Respuesta #2 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! :)
En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Limpiar Buffer en Linux (estructuras)
« Respuesta #3 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.
En línea

Regístrate en
dalberto9410

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Limpiar Buffer en Linux (estructuras)
« Respuesta #4 en: 26 Marzo 2013, 16:19 pm »

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

dalberto9410

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Limpiar Buffer en Linux (estructuras)
« Respuesta #5 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
En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Limpiar Buffer en Linux (estructuras)
« Respuesta #6 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.
En línea

Regístrate en
dalberto9410

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Re: Limpiar Buffer en Linux (estructuras)
« Respuesta #7 en: 26 Marzo 2013, 17:25 pm »

ah bueno vale ! ahora si puedo seguir .....
grax :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Estructuras.....
Programación C/C++
Rodri 1 2,489 Último mensaje 6 Octubre 2011, 19:46 pm
por satu
> [Linux] Técnicas de exploiting por buffer overflow : Sagrini 2012
Bugs y Exploits
Sagrini 8 6,269 Último mensaje 27 Febrero 2012, 19:37 pm
por m0rf
Limpiar terminal con una única sentencia en Linux y Windows (Lenguaje C)
Programación C/C++
NOB2014 2 3,087 Último mensaje 20 Febrero 2016, 18:20 pm
por MAFUS
TIP: para limpiar el buffer de entrada
Programación C/C++
MAFUS 4 5,833 Último mensaje 29 Abril 2016, 19:33 pm
por HardForo
funcion limpiar buffer de teclado
Programación C/C++
Locura_23 8 8,517 Último mensaje 15 Octubre 2021, 23:57 pm
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines