将包含char **数组的结构填充为成员C

…目前正在练习填充包含数组的结构(用于存储多个元素的char数组)。 我想尝试实现的方案如下:

  1. 一般任务是(存储学生信息,作为字符串的名称和学生作为列表或char **采取的课程)
  2. 学生信息首先从文件中加载!(myfile.txt)
  3. tokenize / parse学生信息并加载到struct

包含我的学生信息的文件是:

myfile.txt (每行包含学生姓名和课程列表)由“:”分隔

Austin Barbra:Biology,chemistry,maths,music Romio Chandra:Mechanics,IT,Geology,music,Astronomy . . 

我的main.c是:

 #include  #include  #include  #define path "myfile.txt" typedef struct student_info { char *studt_name; char *cources_as_string; char **cources_as_list; }std_info ; std_info *myinfo; //a global var that will conatain student info int student_count = 0,cource_count=0; void load_file() { int i,yu,index=0; char *line =NULL,* token = NULL; size_t len=0; FILE *fp; fp =fopen(path,"r"); if(fp==NULL) { perror("FILE OPEN ERROR[IN load_file]: "); return; } if (( myinfo = (struct student_info *) malloc( 2 * sizeof(myinfo) ) ) == NULL)//malloc for 2 students puts ("malloc fail"); while (getline(&line, &len, fp) != -1 ) { strtok(line,"\n"); char *token; token = strtok(line,":"); myinfo[index].studt_name=(char * ) malloc(200 * sizeof(char ) ); strcpy(myinfo[index].studt_name,token); token = strtok(NULL, ":"); myinfo[index].cources_as_string=(char * ) malloc(200 * sizeof(char ) ); strcpy(myinfo[index].cources_as_string,token); index++; } student_count = index; fclose(fp); } char** return_cource_list(char* cources_string) { char *token; char **cource_list = malloc (sizeof (char *) * 10); int index = 0; //course_string is delimited by ",": (eg. Biology,chemistry,maths,music). parse this and add to my char ** variable. token = strtok(cources_string,","); cource_list[0]= token; while (token != NULL) { cource_list[index]= token; token = strtok (NULL, ","); index++; } cource_count = index; return cource_list; } int main() { int i,j; load_file(); for(i=0;i>COURCE_string: %s\n",myinfo[i].studt_name,myinfo[i].cources_as_string); char ip_list[200]; char** std_cource_list = return_cource_list(myinfo[i].cources_as_string); for(j=0;j<cource_count;j++) { printf("\tCOURCE_list[%d]: %s\n",j,std_cource_list[j]); //segmentation fault exists here, to copy "std_cource_list[j]" to my struct...(need help here). strcpy(myinfo[i].cources_as_list[j],std_cource_list[j]); } } } 

面临的问题是填充结构的“ char **cources_as_list; ”成员。 我从内部for循环获取seg_fault(在j上迭代)。 我错过了我的代码吗?

我快速修复它以便它不会崩溃并且输出正确,它可以更好(我们可以修复泄漏)但它实际上打印你的东西。

 #include  #include  #include  #define path "myfile.txt" typedef struct student_info { char *studt_name; char *cources_as_string; char **cources_as_list; } std_info; std_info *myinfo; //a global var that will conatain student info int student_count = 0, cource_count = 0; void load_file() { int i, yu, index = 0; char *line = NULL, *token = NULL; size_t len = 0; FILE *fp; fp = fopen(path, "r"); if (fp == NULL) { perror("FILE OPEN ERROR[IN load_file]: "); return; } if ((myinfo = (struct student_info *) malloc(2 * sizeof(*myinfo))) == NULL)//malloc for 2 students puts("malloc fail"); while (getline(&line, &len, fp) != -1) { strtok(line, "\n"); char *token; token = strtok(line, ":"); myinfo[index].studt_name = malloc(200 * sizeof(char)); strcpy(myinfo[index].studt_name, token); token = strtok(NULL, ":"); myinfo[index].cources_as_string = malloc(200 * sizeof(char)); strcpy(myinfo[index].cources_as_string, token); index++; } student_count = index; //fclose(fp); } char **return_cource_list(char *cources_string) { char *token; char **cource_list = malloc(sizeof(char *) * 10); int index = 0; //course_string is delimited by ",": (eg. Biology,chemistry,maths,music). parse this and add to my char ** variable. token = strtok(cources_string, ","); cource_list[0] = token; while (token != NULL) { cource_list[index] = strdup(token); token = strtok(NULL, ","); index++; } cource_count = index; return cource_list; } /* returns an array of char*, all of which NULL */ char **alloc_argv(unsigned rows) { char **matrix = malloc(rows * sizeof(char *)); if (!matrix) abort(); for (unsigned row = 0; row < rows; row++) { matrix[row] = malloc(rows * sizeof(char *)); matrix[row] = "\0"; if (!matrix[row]) abort(); } return matrix; } int main() { int i, j; load_file(); for (i = 0; i < student_count; i++) { printf("============================\n"); printf("NAME: %s >>COURCE_string: %s\n", myinfo[i].studt_name, myinfo[i].cources_as_string); char ip_list[200]; char **std_cource_list = return_cource_list(myinfo[i].cources_as_string); for (j = 0; j < cource_count; j++) { printf("\tCOURCE_list[%d]: %s\n", j, std_cource_list[j]); //segmentation fault exists here, to copy "std_cource_list[j]" to my struct...(need help here). myinfo[i].cources_as_list = alloc_argv(100); myinfo[i].cources_as_list[j] = malloc(sizeof(char **)); strcpy(myinfo[i].cources_as_list[j], std_cource_list[j]); } } } 

产量

 ============================ NAME: Austin Barbra >>COURCE_string: Biology,chemistry,maths,music COURCE_list[0]: Biology COURCE_list[1]: chemistry COURCE_list[2]: maths COURCE_list[3]: music ============================ NAME: Romio Chandra >>COURCE_string: Mechanics,IT,Geology,music,Astronomy COURCE_list[0]: Mechanics COURCE_list[1]: IT COURCE_list[2]: Geology COURCE_list[3]: music COURCE_list[4]: Astronomy Process finished with exit code 0