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)
| | |-+  Problema con scanf en un *char en estructura
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con scanf en un *char en estructura  (Leído 3,415 veces)
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Problema con scanf en un *char en estructura
« en: 10 Diciembre 2013, 14:56 pm »

Buenas, muchas sigo con problemas mediante punteros, es un problema interesante, me interesa saber porque ocurre este error, y no encuentro nada relacionado con el tema, por favor una ayudita.

Al momento de escanear el *char mes, me sale un error de Segmentation Fault, y es que eso ocurre con el scanf de esa cadena, no se porque carajos ocurre eso, conceptualmente. no se como corregir ese error y no se porque tanto dilema con ese apuntador, que ni siquiera esa usandose en la otra estructura, dejandolo independiente de la otra estructura anidada "fecha"

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct fecha
  5. {
  6.    int d, m, a;
  7.    float x;
  8. };
  9.  
  10. struct dato
  11. {
  12.    char* mes;
  13.    struct fecha* r;
  14. }t ;
  15.  
  16. int main()
  17. {
  18.    struct dato nuevoDato;
  19.    printf("++++++****FECHAS****++++++\n\n");
  20.    printf("Digite La fecha:  \n");
  21.    printf("Día:  ");
  22.    scanf("%d", &nuevoDato.r->d);
  23.  
  24.    printf("Mes Letras:  ");
  25.    scanf("%s", &nuevoDato.mes);
  26.  
  27.    printf("Mes número:  ");
  28.    scanf("%d", &nuevoDato.r->m);
  29.  
  30.    printf("Año:  ");
  31.    scanf("%d", &nuevoDato.r->a);
  32.  
  33.    printf("Número coma flotante:  ");
  34.    scanf("%f", &nuevoDato.r->x);
  35.  
  36.  
  37.    printf("El día anotado es:  %d\n", nuevoDato.r->d);
  38.    printf("El mes letras anotado es:  %s\n", &nuevoDato.mes);
  39.    printf("El mes número anotado es:  %d\n", nuevoDato.r->m);
  40.    printf("El año anotado es:  %d\n", nuevoDato.r->a);
  41.    printf("El número coma flotante anotado es:  %.2f\n", nuevoDato.r->x);
  42.    return 0;
  43. }
  44.  
  45.  

me sale esto:



Poco a poco avanzo en el tema de punteros... :silbar: :silbar:


En línea


amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con scanf en un *char en estructura
« Respuesta #1 en: 10 Diciembre 2013, 15:51 pm »

El error se debe a:

Código
  1. scanf("%s", &nuevoDato.mes);

Estás metiendo un texto entero en la dirreción de la variable char*, pero claro solo tiene un byte asi que el resto de caracteres cogen otras zonas de la memoria, probablemente estes modificando otras variables sin darte cuenta... Que haya llegado a hacer segmentation fault ha sido lo mejor, si no estarías como un loco mirando porque las variables cambian de valor de repente.

Prueba a reservar memoria estática previa:
Código
  1. struct dato
  2. {
  3.   char mes[300];
  4.   struct fecha* r;
  5. }t ;

Dado que un array se representa por la dirreción de su primer elemento, no necesitas el operador &:
Código
  1. scanf("%s",nuevoDato.mes);

Aunque yo haría:

Código
  1. fscanf(nuevoDato.mes,299,stdin); // stdin simboliza el teclado

Así te asegura que no se lean más de 300 caracteres.


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Problema con scanf en un *char en estructura
« Respuesta #2 en: 10 Diciembre 2013, 16:49 pm »

lo raro es que el enunciado del ejercicio indica que la asignación *char deberia funcionar, pues en el capitulo indica que el uso de punteros a cadenas maneja el *char como un espacio de memoria para arreglos.

Pensaba que era algo así, entonces lo indicado es siempre usar un arreglo para estas caracteristicas  y no confiarse tanto del apuntador, vale muchas gracias amchacon

Una ultima cosa más, implementando tu solución encontre lo siguiente

1. En la estructura, debo seguir apuntando a un arreglo:

Código
  1. struct dato
  2. {
  3.   char* mes[300];
  4.   struct fecha* r;
  5. }t ;
  6.  

Y para leer un máximo de caracteres con scanf como en el ejemplo que dejaste mes[300]

Código
  1. scanf("%300s", nuevoDato.mes);
  2.  

La verdad estoy más acostumbrado a usar scanf  :xD :xD


Otra cosa sobre el fscanf es que, intente usarlo con demás variables, pero solo me funciona con archivos presentes, como puedo leer una de las otras variables de las estructuras??
« Última modificación: 10 Diciembre 2013, 17:31 pm por dato000 » En línea


amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con scanf en un *char en estructura
« Respuesta #3 en: 10 Diciembre 2013, 18:22 pm »

fscanf? Quería decir fgets, con tanto scanf se me fue la pinza :silbar:

Una ultima cosa más, implementando tu solución encontre lo siguiente

1. En la estructura, debo seguir apuntando a un arreglo:

Código
  1. struct dato
  2. {
  3.   char* mes[300];
  4.   struct fecha* r;
  5. }t ;
  6.  

Y para leer un máximo de caracteres con scanf como en el ejemplo que dejaste mes[300]

Código
  1. scanf("%300s", nuevoDato.mes);
  2.  

La verdad estoy más acostumbrado a usar scanf  :xD :xD
Pues no la conocía, pero si te funciona puede sustituir al fgets.

Otra cosa sobre el fscanf es que, intente usarlo con demás variables, pero solo me funciona con archivos presentes, como puedo leer una de las otras variables de las estructuras??
Como te dije, creía que había puesto fgets. fscanf sería:

Código
  1. fscanf(stdin,"%d",&valor); // recordemos que stdin es el fichero del teclado

Pero para eso usas scanf y escribes menos.

En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Problema con scanf en un *char en estructura
« Respuesta #4 en: 10 Diciembre 2013, 18:34 pm »

Al momento de escanear el *char mes, me sale un error de Segmentation Fault, y es que eso ocurre con el scanf de esa cadena, no se porque carajos ocurre eso
El problema principal no se debe a scanf sino a las direcciones que le pasas a esta. Cuando declaras una variable local:
Código
  1. struct dato nuevoDato;
Esta inicia con un valor no definido o "basura". Si se trata de estructuras esto aplica a sus campos y el programa reventara tan pronto trates de utilizar uno de los punteros.

Para solucionarlo debes primero reservar dos bloques de memoria y almacenar la dirección de estos en los campos de la variable "nuevoDato":
Código
  1. nuevoDato.mes = malloc(1024);
  2. nuevoDato.r = malloc(sizeof *nuevoDato.r);

También debes eliminar la variable "t" ya que no la utilizas en el programa. El programa con los cambios y algunos mas:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct fecha
  5. {
  6.   int d, m, a;
  7.   float x;
  8. };
  9.  
  10. struct dato
  11. {
  12.   char *mes;
  13.   struct fecha* r;
  14. };
  15.  
  16. int main(void)
  17. {
  18.   struct dato nuevoDato;
  19.  
  20.   nuevoDato.mes = malloc(1024);
  21.   nuevoDato.r = malloc(sizeof *nuevoDato.r);
  22.  
  23.   printf("++++++****FECHAS****++++++\n\n");
  24.   printf("Digite La fecha:  \n");
  25.   printf("Dia:  ");
  26.   scanf("%d", &nuevoDato.r->d);
  27.  
  28.   printf("Mes Letras:  ");
  29.   scanf("%s", nuevoDato.mes);
  30.  
  31.   printf("Mes numero:  ");
  32.   scanf("%d", &nuevoDato.r->m);
  33.  
  34.   printf("año:  ");
  35.   scanf("%d", &nuevoDato.r->a);
  36.  
  37.   printf("Numero coma flotante:  ");
  38.   scanf("%f", &nuevoDato.r->x);
  39.  
  40.   printf("El dia anotado es:  %d\n", nuevoDato.r->d);
  41.   printf("El mes letras anotado es:  %s\n", nuevoDato.mes);
  42.   printf("El mes numero anotado es:  %d\n", nuevoDato.r->m);
  43.   printf("El año anotado es:  %d\n", nuevoDato.r->a);
  44.   printf("El numero coma flotante anotado es:  %.2f\n", nuevoDato.r->x);
  45.  
  46.   return 0;
  47. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Problema con scanf en un *char en estructura
« Respuesta #5 en: 10 Diciembre 2013, 20:53 pm »

gracias por sus respuestas gente, todavia no me he metido con reserva dinamica de memoria, pero muy valiosa la info que me dejaste.

Ya que uds saben, entonces el mejor para leer entradas de teclado seria fgets?? o fscanf??? ambas me parecen buenas opciones, pero quisiera saber opiniones expertas.
En línea


amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Problema con scanf en un *char en estructura
« Respuesta #6 en: 10 Diciembre 2013, 21:50 pm »

gracias por sus respuestas gente, todavia no me he metido con reserva dinamica de memoria, pero muy valiosa la info que me dejaste.

Ya que uds saben, entonces el mejor para leer entradas de teclado seria fgets?? o fscanf??? ambas me parecen buenas opciones, pero quisiera saber opiniones expertas.
fgets para cadenas de texto y scanf para todo lo demás.

PD: Sí, scanf sin f.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
dato000


Desconectado Desconectado

Mensajes: 3.034



Ver Perfil
Re: Problema con scanf en un *char en estructura
« Respuesta #7 en: 11 Diciembre 2013, 05:11 am »

fgets para cadenas de texto y scanf para todo lo demás.

PD: Sí, scanf sin f.

oh muchas gracias lo tendre en cuenta, me di cuenta que fscanf y scanf son casi lo mismo XD, pero fgets si captura toda una cadena de texto incluyendo espacios, aunque termina cada cadena con un "\n" pero no es nada dificil maneja eso.

muchas gracias  ;-) ;-)
En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Estructura ARP a buffer unsigned char *
Programación C/C++
ahkbar87 3 3,161 Último mensaje 3 Febrero 2012, 01:44 am
por ahkbar87
Problema con funciones scanf() y gets().
Programación C/C++
latinoalfredo 0 1,816 Último mensaje 22 Octubre 2012, 17:45 pm
por latinoalfredo
Problema conversión Unsigned char a char
Programación C/C++
juliodiez 4 2,627 Último mensaje 19 Enero 2013, 04:34 am
por juliodiez
problema scanf
Programación C/C++
pMV2ere 4 2,991 Último mensaje 1 Noviembre 2013, 08:44 am
por vangodp
C - Problema con scanf y string
Programación C/C++
Xargam 4 2,407 Último mensaje 16 Abril 2018, 04:10 am
por Xargam
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines