Autor
|
Tema: Limpiar Buffer en Linux (estructuras) (Leído 5,607 veces)
|
dalberto9410
Desconectado
Mensajes: 10
|
Hola! hace unos días que comenze a programar en C y he llegado a la parte de estructuras. Antes limpiaba el buffer utilizando 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 !
|
|
|
En línea
|
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
¿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"); 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 ); return 0; }
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
Mensajes: 10
|
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
Mensajes: 724
Intentando ser mejor cada día :)
|
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.
|
|
|
En línea
|
Regístrate en
|
|
|
dalberto9410
Desconectado
Mensajes: 10
|
si tienes razón estaba haciendo algo mal xd y Gracias de nuevo avesudra
|
|
|
En línea
|
|
|
|
dalberto9410
Desconectado
Mensajes: 10
|
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
|
|
|
En línea
|
|
|
|
avesudra
Desconectado
Mensajes: 724
Intentando ser mejor cada día :)
|
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
Mensajes: 10
|
ah bueno vale ! ahora si puedo seguir ..... grax
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Estructuras.....
Programación C/C++
|
Rodri
|
1
|
2,759
|
6 Octubre 2011, 19:46 pm
por satu
|
|
|
> [Linux] Técnicas de exploiting por buffer overflow : Sagrini 2012
Bugs y Exploits
|
Sagrini
|
8
|
6,706
|
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,397
|
20 Febrero 2016, 18:20 pm
por MAFUS
|
|
|
TIP: para limpiar el buffer de entrada
Programación C/C++
|
MAFUS
|
4
|
6,426
|
29 Abril 2016, 19:33 pm
por HardForo
|
|
|
funcion limpiar buffer de teclado
Programación C/C++
|
Locura_23
|
8
|
10,369
|
15 Octubre 2021, 23:57 pm
por RayR
|
|