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.
reg->editorial
reg.editorial
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct libros
{
char titulo[60];
char autor[60];
char editorial[60];
int num_paginas[60];
} struct libros *reg;
void* cast(int m)
{
return(malloc(m*sizeof(struct libros)));
}
main ()
{
int x;
int n;
printf("Cuantos registros deseas ingresar?");
scanf("%d",n);
reg=(struct libros*)cast(n);
for(x=0;x<n;x++)
{
printf("Titulo: ");
gets(reg->titulo);
printf("Autor; ");
gets(reg->autor);
printf("Editorial: ");
gets(reg->editorial);
printf("Numero de paginas: ");
scanf("%d",reg->num_paginas);
reg++;
}
for(x=0;x<n;x++)
{
printf("Titulo: %s",reg->titulo);
printf("Autor; %s",reg->autor);
printf("Editorial: %s",reg->editorial);
printf("Numero de paginas: %s",reg->num_paginas);
reg++;
}
getch();
}
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.
Cita de: Cas980 en 3 Abril 2014, 04:39 AMTengo 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:
for (x = 0; x < n; x++){
printf("Titulo: ");
gets(reg[x].titulo);
printf("Autor; ");
gets(reg[x].autor);
printf("Editorial: ");
gets(reg[x].editorial);
printf("Numero de paginas: ");
scanf("%d", ®[x].num_paginas);
}
Cita de: Cas980 en 3 Abril 2014, 04:39 AMNo tengo muy claro la diferencia entre estas dos formas.
reg->editorial
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:
struct libros {
char titulo[60];
char autor[60];
char editorial[60];
int num_paginas;
};
struct libros *reg;
* Te falta el operador "dirección de" (el '&') en la primera llamada a scanf:
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| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).
* El segundo bucle se debe modificar de forma similar al primero y en la impresión del numero de paginas:
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