Сохранение входного текста в структуру в основном - PullRequest
0 голосов
/ 18 декабря 2018

возник вопрос, как сохранить структуру в массив и распечатать ее в main().

Моя идея состоит в том, чтобы получить данные в формате .txt, а затем сохранить их в массиве структуры.Если я выведу его напрямую с помощью printf(), он будет работать нормально.

Но если я захочу сохранить его в массиве struct и , распечатайте его at the main () Я получаю значения корзины, ничего или только последняя прочитанная структура не будут сохранены во всех позициях массива.

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

typedef struct CAR {
  char* nickname;
  char* model;
} CAR;

void getInputFromFile(struct CAR *arr) {

  . . .
  . . .

  char *nickname = malloc(...);
  char *model = malloc(...);

  int i=0;
  while(fscanf(file,"%s %s\n", model, nickname)==2){
    printf("%s %s\n", model, nickname);        // this works fine!!!

    // Now when i try to save it in a struct it doesn't work
    arr[i]->model = model;
    arr[i]->nickname = nickname;
    i++;

  }
  free(nickname);
  free(model);
}


int main (){
  struct CAR* arr[size];
  getInput(arr);

  // Now iterate over arr to look at values
  for(i = 0; i < size; i++){
     ... 
  }
}

Формат ввода файла выглядит так:

nickname model\n
nickname model\n
...

СпасибоЗа всю вашу помощь заранее!

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Каждой структуре требуется выделенная память для строк.В настоящее время у вас есть один строковый буфер для псевдонима и модели (поэтому он перезаписывается) и освобождаете его в конце цикла, поэтому теперь каждая структура указывает на освобожденную память, а не на исходные строки.

0 голосов
/ 18 декабря 2018

вы должны продублировать (strdup) каждую строку перед тем, как поместить ее в свою структуру

arr[i]->model = strdup(model);
arr[i]->nickname = strdup(nickname);

в настоящее время все ar [] -> модель указывают на одну и ту же область памяти, и этоодин был освобожден, то же самое для всех arr [] -> псевдоним

в вашей программе, вы также забыли распределить каждый CAR, поэтому на самом деле:

arr[i] = (CAR *) malloc(sizeof(CAR));
arr[i]->model = strdup(model);
arr[i]->nickname = strdup(nickname);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...