【问题标题】:Saving input text to struct in main将输入文本保存到主结构中
【发布时间】:2018-12-19 00:40:34
【问题描述】:

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

我的想法是,获取 .txt 的数据,然后将其保存在结构数组中。如果我直接用printf() 输出它就可以了。

但如果我想将它保存在 struct 数组 打印出来 at themain() 我会得到垃圾值,什么都没有,或者只是最后一次读取的结构将被保存到数组的所有位置。

我的代码如下所示:

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
...

提前感谢您的所有帮助!

【问题讨论】:

  • 除了布鲁诺的回答(见下文),这就是strdup 所做的:stackoverflow.com/a/252802/3589567
  • 对不起@AlejandroBlasco 我删除了我的评论并将其作为答案

标签: c arrays pointers struct


【解决方案1】:

您必须先复制(strdup)每个字符串才能将其放入您的结构中

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

当前所有 ar[]->model 都指向同一个内存区域,并且那个内存区域已被释放,所有 arr[]->nickname p>

在您的程序中,您也忘记分配每个 CAR,所以事实上:

arr[i] = (CAR *) malloc(sizeof(CAR));
arr[i]->model = strdup(model);
arr[i]->nickname = strdup(nickname);

【讨论】:

  • 非常感谢您的详细解答。现在它起作用了。帮了我很多!哦,我明白了 - 我必须为结构的每个元素保留额外的内存strdup() 是我搜索的功能...!用strcpy()试了几次!
  • 当你复制一个指针时没有重复,当必须复制指向的元素时你必须自己做。 getInputFromFile 中的参数类型为 false,必须为 getInputFromFile(struct CAR *arr[]),因为 arr 在指向 CAR 的指针向量中需要分配每个 CAR
  • strcpy 仅作为 memcpy 复制,对于您需要分配和复制的字符串,这是由 strdup完成的>
  • 在没有 strdup() 的情况下还有其他方法吗?
  • 你可以通过strlen + malloc + strcpy 自己做strdup,但是你不能避免在使用char *的时候做clone。当然,您可以将char * 替换为char[&lt;some size&gt;] 并执行strcpy,但这不太实用,因为您必须知道可能的最长字符串,并且即使内部值很小,您也会使用长字符串跨度>
【解决方案2】:

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

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2011-02-01
相关资源
最近更新 更多