Массив указателей структуры и присвоение данных структуры - PullRequest
1 голос
/ 25 сентября 2011

Я столкнулся с проблемой или, может быть, я просто делаю что-то не так, так как я новичок в C и структурах.Я хочу взять текстовый файл, например, такой:

3
Trev,CS,3.5
Joe,ART,2.5
Bob,ESC,1.0

и прочитать в первой строке число студентов, а затем собрать информацию о студентах и ​​поместить их в структуру StudentData:

typedef struct StudentData{

    char* name;
    char* major;
    double gpa;

} Student;

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

main(){
    int size, i;
    char* line = malloc(100);
    scanf("%d\n", &size);//get size
    char* tok;
    char* temp;
    Student* array[size]; //initialize array of Student pointers

    for(i = 0; i<size;i++){
      array[i] = malloc(sizeof(Student));//allocate memory to Student pointed to by array[i]
      array[i]->name = malloc(50); //allocate memory for Student's name
      array[i]->major = malloc(30);//allocate memory for Student's major
    }

    for(i = 0; i<size;i++){
      scanf("%s\n", line);//grab student info and put it in a string
      tok = strtok(line, ","); //tokenize string, taking name first
      array[i]->name = tok;//assign name to Student's name attribute
//    printf("%s\n",array[i]->name);//prints correct value
      line = strtok(NULL, ",");//tokenize
      array[i]->major = line;//assign major to Student's major attribute
//    printf("%s\n",array[i]->major);//prints correct value
      temp = strtok(NULL, ",");//tokenize
      array[i]->gpa = atof(temp);//assign gpa to Student's gpa attribute
//    printf("%.2f\n\n",array[i]->gpa); //prints correct value
    }

    for(i=0;i<size;i++){ //this loop is where the data becomes jumbled
      printf("%s\n",array[i]->name);
      printf("%s\n",array[i]->major);
      printf("%.2f\n\n",array[i]->gpa);
  }
}

Вывод выглядит так:

Trev
Joe
3.50

Joe
Bob
2.50

Bob
ESC
1.00

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

Спасибо

1 Ответ

3 голосов
/ 25 сентября 2011

Вы не можете использовать обычное назначение с символом *, как это.Вам нужно будет использовать strcpy.Например:

strcpy(array[i]->name,tok);

В противном случае все массивы [i] -> name указывают на одну и ту же строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...