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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Struct y apuntadores
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Struct y apuntadores  (Leído 1,683 veces)
Cas980

Desconectado Desconectado

Mensajes: 6



Ver Perfil
Struct y apuntadores
« en: 3 Abril 2014, 04:39 am »

Saludos a toda la comunidad, tengo el siguiente programa que maneja una estructura y apartir de un numero n dado por el usuario reserva memoria para guardar todos los registros.
Tengo varias dudas al usar los apuntadores y la forma de acceder a las variables del struct. La forma en que lo estoy haciendo es correcta?  :huh: :huh:
No tengo muy claro la diferencia entre estas dos formas.
Código
  1. reg->editorial
Código
  1. reg.editorial

Código
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4.  
  5. struct libros
  6. {
  7.    char titulo[60];
  8.    char autor[60];
  9.    char editorial[60];
  10.    int num_paginas[60];
  11. } struct libros *reg;
  12.  
  13. void* cast(int m)
  14. {
  15.    return(malloc(m*sizeof(struct libros)));
  16. }
  17.  
  18. main ()
  19. {
  20.    int x;
  21.    int n;
  22.  
  23.    printf("Cuantos registros deseas ingresar?");
  24.    scanf("%d",n);
  25.  
  26.    reg=(struct libros*)cast(n);
  27.  
  28.    for(x=0;x<n;x++)
  29.    {
  30.        printf("Titulo: ");
  31.        gets(reg->titulo);
  32.        printf("Autor; ");
  33.        gets(reg->autor);
  34.        printf("Editorial: ");
  35.        gets(reg->editorial);
  36.        printf("Numero de paginas: ");
  37.        scanf("%d",reg->num_paginas);
  38.  
  39.        reg++;
  40.    }
  41.  
  42.     for(x=0;x<n;x++)
  43.    {
  44.        printf("Titulo: %s",reg->titulo);
  45.        printf("Autor; %s",reg->autor);
  46.        printf("Editorial: %s",reg->editorial);
  47.        printf("Numero de paginas: %s",reg->num_paginas);
  48.  
  49.        reg++;
  50.    }
  51.  
  52.  
  53.    getch();
  54. }


« Última modificación: 18 Abril 2014, 23:33 pm por Cas980 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Struct y apuntadores
« Respuesta #1 en: 3 Abril 2014, 05:22 am »

Si no tienes un curso o libro de calidad sobre C te recomiendo conseguir uno, recomendaciones sobre ellos las puedes encontrar mediante el motor de búsqueda de los foros.

Tengo varias dudas al usar los apuntadores y la forma de acceder a las variables del struct. La forma en que lo estoy haciendo es correcta?
No. Debes primero utilizar el operador "[ ]" para acceder a un elemento del bloque y a continuación el operador "." para acceder al campo indicado. Por ejemplo el primer bucle se debe cambiar a:
Código
  1. for (x = 0; x < n; x++){
  2.   printf("Titulo: ");
  3.   gets(reg[x].titulo);
  4.  
  5.   printf("Autor; ");
  6.   gets(reg[x].autor);
  7.  
  8.   printf("Editorial: ");
  9.   gets(reg[x].editorial);
  10.  
  11.   printf("Numero de paginas: ");
  12.   scanf("%d", &reg[x].num_paginas);
  13. }

No tengo muy claro la diferencia entre estas dos formas.
Código
  1. reg->editorial
  2. reg.editorial
La primera se utiliza si "reg" es un puntero, la segunda cuando no lo es.

En cuanto al programa tiene varios errores, algunos de ellos:

* Te falta el punto y coma después de la declaración de "struct libros" y el numero de paginas no debe ser un array. Hay que cambiar la declaración a:
Código
  1. struct libros {
  2.   char titulo[60];
  3.   char autor[60];
  4.   char editorial[60];
  5.   int num_paginas;
  6. };
  7. struct libros *reg;

* Te falta el operador "dirección de" (el '&') en la primera llamada a scanf:
Código
  1. scanf("%d",n); /* Deberia ser scanf("%d", &n); */

* La función "cast" solo "pasa la cubeta" (llama a otra función), para el caso eliminala y llama a malloc directamente. Y no es necesario convertir el resultado de malloc al tipo apropiado.

* La función main se debe definir como "int main(void) ..." o "int main() ..." y su valor de retorno debe indicarse con al menos "return 0;". También hay que evitar el uso de gets y la biblioteca conio de Borland. Las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

* El segundo bucle se debe modificar de forma similar al primero y en la impresión del numero de paginas:
Código
  1. printf("Numero de paginas: %s",reg->num_paginas);
Como ya te comente debes cambiar el tipo del campo "num_paginas" a int e imprimirlo utilizando el especificador "%d" ("%s" solo debe utilizarse para imprimir cadenas).

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[SOLUCIONADO]¿Como printear un valor de un struct dentro de otro struct?
Programación C/C++
Firos 0 5,192 Último mensaje 24 Marzo 2011, 13:47 pm
por Firos
Ayudenme con apuntadores sii?
Programación C/C++
thapitufa 1 1,982 Último mensaje 2 Diciembre 2012, 06:42 am
por x64core
Problema con apuntadores!!!!!!
Programación C/C++
7hongo7 7 4,259 Último mensaje 5 Julio 2013, 10:16 am
por kmilinh0
[C] Apuntadores a estructuras « 1 2 »
Programación C/C++
edr89 10 5,298 Último mensaje 8 Octubre 2013, 05:48 am
por edr89
Aprendiendo el uso basico de apuntadores ! no me da el resultado correcto
Programación C/C++
harofenix 2 1,986 Último mensaje 25 Diciembre 2014, 20:23 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines