Problema leer char *

Iniciado por Vacka_96, 1 Noviembre 2016, 05:55 AM

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

Vacka_96

Que tal, estoy haciendo un programa y me surge un problema, lo que pasa es que a la hora de leer mi variable char* no la esta aceptando.....
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

struct Alumno{
   char *nombre;
   int matricula;
   int id_Materias[4];
};

int matricula = 1;

typedef struct Alumno ALUMNO;

int validate(char *opcion, int op); //Opcion 1 Valida digitos, Opcion 2 Valida chars
void add_Alumno(ALUMNO *);
void print_Alumno(ALUMNO *);

int main(){
   ALUMNO alumno;
   add_Alumno(&alumno);
   print_Alumno(&alumno);
   system("pause");
   return 0;
}

void add_Alumno(ALUMNO *alumno){
   int pass = 0;
   char *opcion;
   int flag = 0;
   int i = 0;
   int cont_Materias = 0;
   for(i=0; i<6; i++){
       alumno->id_Materias[i] = 0;
   }
   do{
       system("cls");
       printf("\n\n\tIngrese el nombre del alumno: ");
       fflush(stdin);
       scanf(" %[^\n]", &(*opcion));
       pass = validate(opcion, 2);
   }while(pass != 1);
   printf("flag1");
   alumno->nombre = opcion;
   printf("flag2");
   system("cls");
   printf("\n\n\tLa matricula del alumno es: %08d",matricula);
   system("pause");
   alumno->matricula = matricula;
   system("cls");
   do{
       do{
           do{
               system("cls");
               printf("\n\n\t***** MATERIAS *****");
               printf("\n\n\t1. MATEMATICAS");
               printf("\n\t2. ESPANIOL");
               printf("\n\t3. PROGRAMACION");
               printf("\n\t4. ARTES");
               printf("\n\t5. CULTURA DE CALIDAD");
               printf("\n\t6. CALCULO");
               printf("\n\n\tIngrese el id de la materia: ");
               scanf(" %[^\n]", &(*opcion));
               pass = validate(opcion, 1);
           }while(pass != 1);
           pass = atoi(opcion);
       }while(pass<1 || pass>6);
       flag = 0;
       for(i=0; i<6; i++){
           printf("\n\tMateria: %d", alumno->id_Materias);
           system("pause");
           if(alumno->id_Materias[i] == pass){
               flag = 1;
               break;
           }
       }
       if(flag != 1)
           alumno->id_Materias[cont_Materias] = pass;
   }while(flag != 1);


}

void set_Name_Alumno(ALUMNO *alumno){
   printf("\n\tSu nombre actual es: ");
   print_Alumno(alumno);
   system("pause");
   int pass = 0;
   char *opcion;
   do{
       system("cls");
       printf("\n\tIngrese su nuevo nombre: ");
       fflush(stdin);
       scanf(" %[^\n]", &(*opcion));
       pass = validate(opcion, 2);
   }while(pass != 1);
   alumno->nombre = opcion;
}

void print_Alumno(ALUMNO *alumno){
   printf("\n\tNombre: %s", alumno->nombre);
   printf("\n\tMatricula: %08d", alumno->matricula);
}

int validate(char *opcion, int op){
   int i = 0;
   for(i=0; i<strlen(opcion); i++){
       if(!isdigit(opcion[i]) && op == 1){
           return 0;
       }
       if(!isalpha(opcion[i]) && op == 2 && !(opcion[i] == ' ')){
           return 0;
       }
   }
   return 1;
}



Mod: Los códigos deben ir en etiquetas GeSHi

MAFUS

En la línea 41 y en la 96 pecas por lo mismo: intentas asignar una cadena a un puntero sin inicializar y eso no se puede. Primero debes adquirir la memoria suficiente para que la cadena que vaya a recibir quepa allí dentro, es después que podrás pasarle una cadena con scanf. Otra cosa es que uses el modificador m de scanf (es un estándar POSIX, no de la biblioteca básica de C) para que la función adquiera ella misma el espacio, que luego tendrás que liberar con free. En tu caso el argumento de la cadena de control de scanf sería %m[^\n].