Cual es el problema con mi codigo en C?

Iniciado por Evox4, 4 Septiembre 2016, 23:59 PM

0 Miembros y 1 Visitante están viendo este tema.

Evox4


#include <stdlib.h>
#include<stdio.h>
#define MAX_NOMBRE 30

struct pelicula{
char *nombre;
char *genero;
short año;
int numDirectores;
char *directores[10];
};

void imprimirDatosPelicula(struct pelicula);
void LeerDatosPelicula( struct pelicula *peli);

int main(){
struct pelicula peli;
LeerDatosPelicula(&peli);
imprimirDatosPelicula(peli);
return 0;
}

void imprimirDatosPelicula(struct pelicula movie){
printf("PELICULA: %s\n", movie.nombre);
printf("GENERO: %s\n", movie.genero);
printf("año: %d\n", movie.año);
printf("# DIRECTOR(ES): %d \n", movie.numDirectores);
int cont = 0;
for ( ; cont < movie.numDirectores ; cont++){
printf("DIRECTOR: %s\n", movie.directores[cont]);
   }
}


void LeerDatosPelicula(struct pelicula *peli){
 int i=0;

  printf("\n\n\tlEER DATOS PELICULA\n");
 printf("Pelicula: ");
   fgets(peli->nombre, MAX_NOMBRE, stdin);
fflush(stdin);
printf ("Genero: ");
fgets(peli->genero, MAX_NOMBRE, stdin);
fflush(stdin);
printf("año: ");
scanf("%d",peli->año);
printf("Cuantos directores?: ");
scanf("%d",peli->numDirectores);
if(peli->numDirectores < 1)   peli->numDirectores=1;
if(peli->numDirectores > 10)  peli->numDirectores=10;

for(i=0; i< 1; i++){
peli->directores[i]=(char*) malloc (sizeof (char)*MAX_NOMBRE);
printf("Director %d:  ",i+1);
fflush(stdin);
gets(peli->directores[i]);
}

}




Estoy usando Devc++ y al parecer compila muy bien pero a la hora de pedir datos marca error. Alguien que me ayude.


MAFUS

Es raro que te acepte 'año' cuando la 'ñ' no suele ser una letra válida para un identificador.
También debería saltarte un aviso por el uso de gets. Cámbialo por fgets, como en las demás partes del código.

Ahora los errores te saltan porqué intentas asignar los valores recogidos por fgets a punteros sin inicializar. Para solucionarlo puedes hacer varias cosas:

  • En el struct en vez de punteros usar arrays.
  • Usar malloc para adquirir memoria para los punteros antes de tomar las cadenas con fgets
  • Usar scanf con el operador %ms para que éste adquiera memoria por ti para el puntero

Evox4

#2
En realidad no estoy haciendo uso de la letra ñ, estoy usando poniendolo como "a n i o".
No me permiten usar arrays en el programa.


He asignado memoria como me dijiste y ahora si avanza pero cuando pide cuantos directores necesita ya se cierra.


tambien estoy haciendo uso de " (int *)&peli->año ", que en verdad no se que hace. jeje
Algun otro consejo?



void LeerDatosPelicula(struct pelicula *peli){
 int i=0;
peli->nombre = (char*) malloc(sizeof (char)*MAX_NOMBRE);
peli->genero = (char*) malloc(sizeof (char)*MAX_NOMBRE);
  printf("\n\n\tlEER DATOS PELICULA\n");
 printf("Pelicula: ");
   fgets(peli->nombre, MAX_NOMBRE, stdin);
fflush(stdin);
printf ("Genero: ");
fgets(peli->genero, MAX_NOMBRE, stdin);
fflush(stdin);
printf("año: ");
fflush(stdin);
scanf("%d",(int *)&peli->año);
printf("Cuantos directores?: ");
scanf("%d",peli->numDirectores);
if(peli->numDirectores < 1)   peli->numDirectores=1;
if(peli->numDirectores > 10)  peli->numDirectores=10;

for(i=0; i< peli->numDirectores; i++){
peli->directores[i]=(char*) malloc (sizeof (char)*MAX_NOMBRE);
printf("Director %d:  ",i+1);
fflush(stdin);
fgets(peli->directores[i], MAX_NOMBRE, stdin);
}

}