Nose si la estructura anidada esta bien declarada porque cuando voy a ingresar los datos del coordinador el programa deja de funcionar, y si estoy creando bien las cadenas y mercados dinamicamente?
/*
Crear las cadenas dinámicamente.
Los mercados crearlos dinámicamente. */
#include<stdio.h>
#include<stdlib.h>
typedef struct Mercados_Municipales{
char *nombre;
char *direccion;
char *telefono;
struct Datos_Coordinador *c;
}Mercados;
struct Datos_Coordinador{
char *nombrec;
char *apellidoc;
char *cedulac;
char *telefonoc;
};
void Presentacion();
Mercados *Leer_Mercado(void);
void Imprimir_Mercado(Mercados *mercado);
int main(){
Mercados *mercados[20];
char desicion;
int cantidad, mercado = 0;
Presentacion();
for(cantidad = 0; cantidad < 20; cantidad++){
printf("\n\tMercado Municipal #%d\n\n", cantidad + 1);
mercados[cantidad] = Leer_Mercado();
do{
printf("\n\tPasamos a otro? [S/N] ");
desicion = getchar(); /* Leemos un caracter */
while(getchar() == EOF); /* Necesario para que se coma el \n */
}while(desicion != 'S' && desicion != 's' && desicion != 'N' && desicion != 'n');
/* Si elige N o n, se sale */
if(desicion == 'N' || desicion == 'n') break;
}
printf("\nInformacion del Mercado: ");
scanf("%d", &mercado);
Imprimir_Mercado(mercados[mercado - 1]);
return 0;
}
void Presentacion(){
printf("\t\t********************************\n");
printf("\t\t* Ciudad Guayana *\n");
printf("\t\t* Mercados municipales *\n");
printf("\t\t********************************\n");
}
Mercados *Leer_Mercado(){
Mercados *mercado = (Mercados *) malloc(sizeof(Mercados));
mercado->nombre = (char *) malloc(sizeof(char) * 20);
mercado->direccion = (char *) malloc(sizeof(char) * 50);
mercado->telefono = (char *) malloc(sizeof(char) * 15);
printf("Nombre: ");
gets(mercado->nombre);
printf("Direccion: ");
gets(mercado->direccion);
printf("Telefono: ");
gets(mercado->telefono);
mercado->c->nombrec = (char *) malloc(sizeof(char) * 20);
mercado->c->apellidoc = (char *) malloc(sizeof(char) * 20);
mercado->c->cedulac = (char *) malloc(sizeof(char) * 15);
mercado->c->telefonoc = (char *) malloc(sizeof(char) * 15);
printf("Informacion del Coordinador\n\n");
printf("\tNombre: ");
gets(mercado->c->nombrec);
printf("\tApellido: ");
gets(mercado->c->apellidoc);
printf("\tCedula: ");
gets(mercado->c->cedulac);
printf("\tTelefono: ");
gets(mercado->c->telefonoc);
return mercado;
}
void Imprimir_Mercado(Mercados *mercado){
printf("\n\tMercado Municipal: %s\n\n", mercado->nombre);
printf("Direccion: %s\tTelefono: %s\n\n",
mercado->direccion, mercado->telefono);
printf("Datos del Coordinador:\n\n");
printf("%s %s\tCedula: %s\n",
mercado->c->nombrec, mercado->c->apellidoc,
mercado->c->cedulac);
printf("Telefono: %s\n\n", mercado->c->telefonoc);
}
El Coordinador "c" es también un puntero, así que hay que inicializarlo con memoria:
mercado->c = (...) malloc(...);