将输入文本保存到主结构中

时间:2018-12-18 16:32:27

标签: c arrays pointers struct

有一个问题,如何将结构保存到数组并在main()中打印出来。

我的想法是,获取.txt的数据,然后将其保存在struct数组中。如果我直接用printf()输出它,效果很好。

但是,如果我想将其保存在结构数组 中并将其打印出 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 :(得分:2)

在将每个字符串放入结构之前,您必须复制(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);

答案 1 :(得分:1)

每个结构都需要为字符串分配内存。当前,您只有一个用于昵称和模型的字符串缓冲区(因此被覆盖),并在循环结束时释放它,因此现在每个结构都指向释放的内存,而不是原始的字符串。