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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  sustituir scanf
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: sustituir scanf  (Leído 7,119 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
sustituir scanf
« en: 12 Octubre 2013, 04:29 am »

Saludos

Tengo el siguiente codigo en el que le ingresas datos a una estructura x, el programa compila correctamente pero tengo una duda, tengo entendido que cuando alternas una funcion como fgets() y scanf() te da problemas, y para esto le puse un ciclo while con un getchar(). Pero queria saber si podia sustituir el scanf por otra funcion que no me provoque basura en el buffer, para asi no tener que ponerle el while(getchar()!= '\n')

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TAM 20
  4. #define MAX 10
  5. typedef struct datos
  6. {
  7.    char nombre[TAM];
  8.    int edad;
  9.    char ciudad_residencia[TAM];
  10. }Persona;
  11.  
  12. void entrada(Persona *p);
  13.  
  14. int main()
  15. {
  16.    Persona p;
  17.    int i;
  18.    for(i = 0;i < 10;i++)
  19.       entrada(&p);
  20.    return 0;
  21. }
  22.  
  23. void entrada(Persona *p)
  24. {
  25.    printf("Dame nombre:\n");
  26.    fgets(p->nombre,TAM,stdin);
  27.    printf("Dame edad:\n");
  28.    while(getchar()!='\n')
  29.    scanf("%d",&p->edad);
  30.    printf("Dame ciudad de residencia:\n");
  31.    fgets(p->ciudad_residencia,TAM,stdin);
  32. }
  33.  

gracias


En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: sustituir scanf
« Respuesta #1 en: 12 Octubre 2013, 11:46 am »

fgets
+
sscanf

http://foro.elhacker.net/programacion_cc/zanjar_de_una_vez_fflushstdin-t265125.0.html;msg1294511


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: sustituir scanf
« Respuesta #2 en: 14 Octubre 2013, 19:19 pm »

Saludos Eternal Idol, por lo que he entendido la funcion sscanf obtiene la entrada de un arreglo y no de un stream, entonces si yo quisiera ponerle un stdin para indicarle que va a tomar la entrada de lo que le ingrese por el teclado me va a dar error, que puedo hacer en este caso?

de antemano gracias
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: sustituir scanf
« Respuesta #3 en: 14 Octubre 2013, 19:42 pm »

Para eso se llama primero a fgets con stdin, fijate en el enlace que deje antes.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: sustituir scanf
« Respuesta #4 en: 15 Octubre 2013, 22:28 pm »

muchas gracias Eternal Idol ya cheque el enlace que dejaste, y ya pude hacer el codigo que me tiene que ingresar datos de una estructura en un archivo, cerrarlo y despues que me imprima en pantalla los datos que se habian guardado, pero tengo otra duda, cada vez que utilizas fgets() es necesario quitarle el salto de linea '\n', se recomienda hacer eso?? y tambien en el sscanf si quiero que lo que me ingrese sea un entero no se desperdicia espacio en el array que le puse asi:

Código
  1. void entrada(Persona *p)
  2. {
  3.    char cad[10];
  4.    printf("Dame nombre:\n");
  5.    fgets(p->nombre,MAX,stdin);
  6.    printf("Dame edad:\n");
  7.    fgets(cad,10,stdin);// aqui tiene una array de 10 elementos pero solo ocupo un int
  8.    sscanf(cad,"%d",&p->edad);
  9. }

aqui esta el codigo completo

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 20
  5. /*
  6.    Crear un “struct” que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia.
  7.    Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado “gente.dat”, cerrar el fichero,
  8.    volverlo a abrir para lectura y mostrar los datos que se habían guardado.
  9. */
  10. typedef struct datos
  11. {
  12.    char nombre[MAX];
  13.    int edad;
  14.    char ciudad_residencia[MAX];
  15. }Persona;
  16.  
  17. void entrada(Persona *p);
  18. void mostrar(FILE *ap);
  19.  
  20. int main()
  21. {
  22.    FILE *fd,*ap;
  23.    Persona p;
  24.    if((fd = fopen("F:\\gente.txt","w"))!= NULL)
  25.    {
  26.        entrada(&p);
  27.        fprintf(fd,"%s\n",p.nombre);
  28.        fprintf(fd,"%d\n",p.edad);
  29.        fprintf(fd,"%s\n",p.ciudad_residencia);
  30.        fclose(fd);
  31.        if((ap = fopen("F:\\gente.txt","r"))!= NULL);
  32.           mostrar(ap);
  33.    }
  34.    else
  35.       printf("No se pudo crear archivo");
  36.    return 0;
  37. }
  38.  
  39. void entrada(Persona *p)
  40. {
  41.    char cad[10];
  42.    printf("Dame nombre:\n");
  43.    fgets(p->nombre,MAX,stdin);
  44.    printf("Dame edad:\n");
  45.    fgets(cad,10,stdin);
  46.    sscanf(cad,"%d",&p->edad);
  47.    printf("Dame ciudad de residencia:\n");
  48.    fgets(p->ciudad_residencia,MAX,stdin);
  49.    system("cls");
  50. }
  51.  
  52. void mostrar(FILE *ap)
  53. {
  54.    int car;
  55.    while((car = fgetc(ap))!= EOF)
  56.       printf("%c",car);
  57. }
  58.  
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: sustituir scanf
« Respuesta #5 en: 15 Octubre 2013, 23:28 pm »

muchas gracias Eternal Idol ya cheque el enlace que dejaste, y ya pude hacer el codigo que me tiene que ingresar datos de una estructura en un archivo, cerrarlo y despues que me imprima en pantalla los datos que se habian guardado, pero tengo otra duda, cada vez que utilizas fgets() es necesario quitarle el salto de linea '\n', se recomienda hacer eso?? y tambien en el sscanf si quiero que lo que me ingrese sea un entero no se desperdicia espacio en el array que le puse asi:

De nadas. Partiendo de la base de que esta el salto de linea (dependera del tamaño que le pases a fgets y lo que escriba el usuario) si lo que queres guardar no es una linea en si misma entonces tiene sentido sacarlo. cad solo tiene como ambito entrada, cuando la funcion retorna esos caracteres en la pila vuelven a estar disponibles.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: sustituir scanf
« Respuesta #6 en: 16 Octubre 2013, 05:10 am »

una ultima pregunta, si le quiero hacer una modificacion al codigo y en vez de que me guarde los datos de la estructura en el archivo con fprintf quiero que lo haga con fwrite, ya no funciona como lo hacia con fprintf ahora me imprime basura, por que sucede esto??

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX 20
  5. /*
  6.    Crear un “struct” que almacene los siguientes datos de una persona: nombre, edad, ciudad de residencia.
  7.    Pedir al usuario esos datos de una persona y guardarlos en un fichero llamado “gente.dat”, cerrar el fichero,
  8.    volverlo a abrir para lectura y mostrar los datos que se habían guardado.
  9. */
  10. typedef struct datos
  11. {
  12.    char nombre[MAX];
  13.    int edad;
  14.    char ciudad_residencia[MAX];
  15. }Persona;
  16.  
  17. void entrada(Persona *p);
  18. void mostrar(FILE *ap);
  19.  
  20. int main()
  21. {
  22.    FILE *fd,*ap;
  23.    Persona p;
  24.    if((fd = fopen("F:\\gente.txt","w"))!= NULL)
  25.    {
  26.        entrada(&p);
  27.        fwrite(&p,sizeof(Persona),1,fd);
  28.        fclose(fd);
  29.        if((ap = fopen("F:\\gente.txt","r"))!= NULL);
  30.           mostrar(ap);
  31.    }
  32.    else
  33.       printf("No se pudo crear archivo");
  34.    return 0;
  35. }
  36.  
  37. void entrada(Persona *p)
  38. {
  39.    char cad[10];
  40.    printf("Dame nombre:\n");
  41.    fgets(p->nombre,MAX,stdin);
  42.    printf("Dame edad:\n");
  43.    fgets(cad,10,stdin);
  44.    sscanf(cad,"%d",&p->edad);
  45.    printf("Dame ciudad de residencia:\n");
  46.    fgets(p->ciudad_residencia,MAX,stdin);
  47.    system("cls");
  48. }
  49.  
  50. void mostrar(FILE *ap)
  51. {
  52.    int car;
  53.    while((car = fgetc(ap))!= EOF)
  54.       printf("%c",car);
  55. }
  56.  
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: sustituir scanf
« Respuesta #7 en: 16 Octubre 2013, 09:32 am »

fwrite hace exactamente lo que vos le decis, ahi estas pasandole sizeof(Persona) como tamaño y eso incluye TODOS los bytes de las cadenas, aunque estas esten terminadas antes ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: sustituir scanf
« Respuesta #8 en: 17 Octubre 2013, 00:36 am »

ya entendi en donde estaba el error, sizeof(Persona) es igual a 44 porque toma las elementos de la struct completos, otra duda, estaba leyendo en una pagina de internet y me decia que cuando estoy guardando estructuras en un archivo de texto tengo que hacerlo campo por campo, o sea que tendria que usar 3 fwrites() y cuando estoy abriendo el archivo en binario puedo hacerlo todo en un solo paso, si es asi o no?

gracias de nuevo
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: sustituir scanf
« Respuesta #9 en: 17 Octubre 2013, 00:44 am »

Si inicializas todo a 0 (asi por ejemplo se sabe donde termina la cadena) y no te importa escribir mas bytes de los necesarios podes escribir la estructura entera.
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con scanf
Programación C/C++
Caster 3 4,217 Último mensaje 29 Septiembre 2012, 13:01 pm
por Caster
Pregunta de C scanf
Programación C/C++
g0rg3d3l4s3lv4 3 2,733 Último mensaje 15 Marzo 2013, 04:21 am
por g0rg3d3l4s3lv4
scanf y gets « 1 2 »
Programación C/C++
m@o_614 16 8,391 Último mensaje 21 Julio 2013, 19:29 pm
por rir3760
[C] Comparación entre el gets y el scanf « 1 2 »
Programación C/C++
niñoAtómico 12 6,367 Último mensaje 12 Octubre 2013, 23:24 pm
por vangodp
Ayuda con el scanf n el for
Programación C/C++
Jorge LuissxX 2 1,666 Último mensaje 18 Mayo 2019, 02:07 am
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines