2016-05-21 20 views
2

... derzeit praktizieren, um eine Struktur zu füllen, die ein Array enthält (char-Array zum Speichern mehrerer Elemente). Das Szenario ist versucht zu implementieren sind wie folgt:Füllen Sie eine Struktur mit char ** -Array als Mitglied, C

  1. Die allgemeine Aufgabe (zum Speichern von Schülerdaten, Namen als String und vom Schüler genommen Kurse als Liste oder char **)
  2. Schüler Informationen zuerst ! geladen aus der Datei (myfile.txt)
  3. tokenize/parsen Informationen Student und laden

die Datei auf Struktur, die meine Schüler Informationen enthält, ist:

meinedatei.txt (jede Zeile enthält Studentennamen und die Liste der Kurse) begrenzt durch ":"

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

Mein main.c ist:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#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<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). 
      strcpy(myinfo[i].cources_as_list[j],std_cource_list[j]); 
     } 
    } 
} 

Das Problem ist vor ist die "zu füllen char **cources_as_list; "Mitglied der Struktur. Ich bekomme einen seg_fault von der inneren for-Schleife (iteriert auf j). Vermisse ich etwas in meinem Code?

+1

'malloc (2 * sizeof (myinfo))' - Sie 'malloc verwenden (2 * sizeof (* myinfo))' statt, ansonsten ordnet es nur Platz für zwei Zeiger. – kfx

+1

'cource_list [index] = token;' - wahrscheinlich möchten Sie 'cource_list [index] = strdup (token);' verwenden, um jede Zeichenkette in einer eigenen dynamisch zugewiesenen Speicherregion zu haben. – kfx

+0

@kfx: Ich habe meine ** "cource_list []" ** erfolgreich zurückgegeben. Das Problem ist, wenn ich "cource_list zu meiner Struktur" lade. d. h. in der Datei strcpy (myinfo [i] .cources_as_list [j], std_cource_list [j]) '. Ich denke, ich muss einen Speicher zuweisen. Kannst du mich zu Malloc führen? Vielen Dank. –

Antwort

-1

Ich reparierte es schnell, so dass es nicht abstürzt und Ausgabe ist korrekt, es kann besser sein (es gibt Lecks, die wir beheben können), aber es druckt tatsächlich Ihre Sachen jetzt.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#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]); 
     } 
    } 
} 

Ausgabe

============================ 
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 
+1

>> FERTIG! Was, wenn du meine Nacht gerettet hast? Die Funktion * alloc_argv (100) ** hat es geschafft! Es funktioniert jetzt gut! Guter Schuss! –

+0

@ kahsay.k Danke, es hat Spaß gemacht :-) –

Verwandte Themen