Динамическая структура массивов, ошибка сегментации

Я пишу prgram, который должен был сделать следующее

-open file
-read file
-tokenize file,getting name,course,grade tokens
-dynamiclly add these tokens to an array of structures

файл имеет следующий формат

Khai,IE 3301,69
Ashley,MATH 1426,59
Alisaad,CSE 1325,31
August,CSE 1325,55
Ethan,CSE 1320,92

но я продолжаю получать ошибку сегментации, которую я не понимаю, я смотрел на индексы, и они, похоже, не выходят за границы, поэтому я не уверен, что происходит. Ниже приведен мой код

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

struct info {
char* student;
char* courseName;
int grade;
};



int main(void)
{
 char buffer[100];
 struct info **strarray = NULL; /*struct of Arrays*/
 char* token;
 char* studen = (char *) malloc(15);
 char* coursename = (char *) malloc(10);
 int grad = malloc(sizeof(int)),count = 0,index = 0;
 char* del = ",";
 FILE* fp = fopen("input-hw05a.csv","r");

 while(fgets(buffer,sizeof(buffer),fp) != NULL)
 {
 token = strtok(buffer,del);
 studen = token;
 while(token != NULL)
 {
 if(count == 1)
 coursename = token;
 if(count ==2)
 grad = atoi(token);

 token = strtok(NULL,del);
 count = count + 1;
 }
 /*add ONE element to the array*/
 strarray = (struct info **)realloc(strarray,(index + 1) * sizeof(struct info *));

 /*allocate memory for struct info*/
 strarray[index] = (struct info *)malloc(sizeof(struct info));

 /*copy data inso structure array*/
 strcpy(strarray[index]->student,studen);
 strcpy(strarray[index]->courseName,coursename);
 strarray[index]->grade = grad;
 index = index + 1;
 }
 int i = 0;
 for(i = 0; i < index; i++)
 {
 printf("%s %s %d\n",strarray[i]->student,strarray[index]->courseName,strarray[index]->grade);
 }

}
</string.h></stdlib.h></stdio.h>
3 ответа

В вашем коде, вероятно, больше ошибок malloc. Я упомянул об этом в комментариях.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct info {
 char* student;
 char* courseName;
 int grade;
};

int main()
{
 char buffer[100];
 struct info **strarray = NULL; /*struct of Arrays*/
 char* token;
 char* studen = (char *) malloc(15);
 char* coursename = (char *) malloc(10);
 int grad, count = 0,index = 0;
 char* del = ",";
 FILE* fp = fopen("input-hw05a.csv", "r");

while(fgets(buffer,sizeof(buffer),fp) != NULL)
{
 token = strtok(buffer,del);
 studen = token;
 count = 0; /* You missed it. Otherwise, count will never be 1 and 2 again when control enters the loop second time */
 while(token != NULL)
 {
 if(count == 1)
 coursename = token;
 if(count ==2)
 grad = atoi(token);

 token = strtok(NULL,del);
 count = count + 1;
 }
 /*add ONE element to the array*/
 strarray = (struct info **)realloc(strarray,(count + 1) * sizeof(struct info *));
 /*allocate memory for struct info*/
 strarray[index] = (struct info *)malloc(sizeof(struct info));
 /*copy data inso structure array*/
 strarray[index]->student = (char *)malloc(strlen(studen)*sizeof(char)); //you need to allocate memory for student, to do a string copy
 strcpy(strarray[index]->student,studen);
 strarray[index]->courseName = (char *)malloc(strlen(coursename)*sizeof(char)); // similarly, you need to allocate memory for coursename, to do a string copy
 strcpy(strarray[index]->courseName,coursename);
 strarray[index]->grade = grad;
 index = index + 1;
}
int i = 0;
for(i = 0; i < index; i++)
{
 printf("%s %s %d\n",strarray[i]->student,strarray[i]->courseName,strarray[i]->grade); //In your code it was strarray[index]->courseName & strarray[index]->grade
}
return 0;
}
</stdlib.h></string.h></stdio.h>


Вышеуказанные коды не работали для меня.

Необходимо изменить ниже:

1. Добавьте count = 0 после внутреннего цикла while, чтобы сбросить счет, чтобы он правильно считывал и хранил данные. Способ хранения данных в вашем коде:

Хая

IE 3301

69

Ashley

Alisaad

августейший

Итан

Поскольку счетчик никогда не возвращается к 0, он не изменяется на 1 или 2 снова.. так отображаются только имена.

2. При отображении данных он использует strarray [index] → courseName, strarray [index] → grade. Поскольку индекс всегда увеличивается в конце. Он всегда будет указывать на то, что будет выделено в следующем цикле. Следовательно, в последнем цикле он указывает на память, которой нет, и заканчивается ошибкой сегментации.


как написано в комментариях, вы должны хранить память для ученика и имя курса в структуре. Я также удалил nonecasary mallocs

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

struct info {
char* student;
char* courseName;
int grade;
};



int main(void)
{
 char buffer[100];
 struct info **strarray = NULL; /*struct of Arrays*/
 char* token;
 char* studen;
 char* coursename;
 int grad,count = 0,index = 0;
 char* del = ",";
 FILE* fp = fopen("input-hw05a.csv","r");

 while(fgets(buffer,sizeof(buffer),fp) != NULL)
 {
 token = strtok(buffer,del);
 studen = token;
 while(token != NULL)
 {
 if(count == 1)
 coursename = token;
 if(count ==2)
 grad = atoi(token);

 token = strtok(NULL,del);
 count++;
 }
 /*add ONE element to the array*/
 strarray = realloc(strarray,(index + 1) * sizeof(struct info *));

 /*allocate memory for struct info*/
 strarray[index] = malloc(sizeof(struct info));

 /*copy data inso structure array*/
 strarray[index]->student = malloc(strlen(studen)+1);
 strcpy(strarray[index]->student,studen);
 strarray[index]->courseName = malloc(strlen(coursename)+1);
 strcpy(strarray[index]->courseName,coursename);
 strarray[index]->grade = grad;
 index++;
 }
 int i = 0;
 for(i = 0; i < index; i++)
 {
 printf("%s %s %d\n",strarray[i]->student,strarray[index]->courseName,strarray[index]->grade);
 }
 //free all malloc memory
 return 0;
}
</string.h></stdlib.h></stdio.h>

licensed under cc by-sa 3.0 with attribution.