将字符串传递给结构

问题描述 投票:0回答:1

我的文件中有一个汽车列表,其中行的形式为

car_1_name [car_1_id] & car_2_name [car_2_id]

我想将每辆车的名称和 ID 存储在一个数组中。为此,我创建了两个结构,称为“_Car_”和“_Car_List_”。然而,我为解析上面表格的行而编写的函数“parse”似乎没有正确提取汽车的名称(我使用 strtok 来分割字符串)。但是,当我手动将汽车添加到列表中时,字符串会正确显示。您可以在下面找到我的最小工作示例:

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

struct _Car_
{
  char* name_;
  int id_;
  struct _Car_* parent_1_;
  struct _Car_* parent_2_;
};

struct _Car_List_
{
  struct _Car_* car_list[100];
  int number_of_cars;
};


struct _Car_* createCar(char* name, int id)
{
  struct _Car_* car = malloc(sizeof(struct _Car_));

  if (car == NULL)
    return NULL;

  car -> name_ = name;
  car -> id_ = id;

  return car;
}

void addCar(struct _Car_List_* my_list, struct _Car_* car)
{
  my_list -> car_list[my_list -> number_of_cars] = car;
  my_list -> number_of_cars = my_list -> number_of_cars + 1;

}

int parse(struct _Car_List_* my_list)
{
  char string[] = "Ferrari [3] & Porsche [6]\n";

  char* car_1_string = strtok(string, "&");
  char* car_2_string = strtok(NULL, "&");

  char* car_1_name = strtok(car_1_string, "[");
  int car_1_id = atoi(strtok(NULL, "]"));

  char* car_2_name = strtok(car_2_string, "[");
  int car_2_id = atoi(strtok(NULL, "]"));

  struct _Car_* car_1 = createCar(car_1_name, car_1_id);
  struct _Car_* car_2 = createCar(car_2_name, car_2_id);

  addCar(my_list, car_1);
  addCar(my_list, car_2);

  return 0;
}

void printList(struct _Car_List_* my_list)
{
  int i = 0;
  struct _Car_* car = my_list -> car_list[i];

  while (car != NULL)
  {
    printf("- %s [%d]\n", car -> name_, car -> id_);
    i = i + 1;
    car = my_list -> car_list[i];
  }
}

int testAdd(struct _Car_List_* my_list)
{
  struct _Car_* car = createCar("Renault", 1);
  addCar(my_list, car);

  return 0;
}

int main()
{
  struct _Car_List_* my_list = malloc(sizeof(struct _Car_List_));
  my_list -> number_of_cars = 0;
  for (int i = 0; i < 100; i = i + 1)
    my_list -> car_list[i] = NULL;

  testAdd(my_list);
  parse(my_list);

  printf("Below the printed list:\n");
  printList(my_list);

  return 0;
}

你能告诉我我做错了什么吗?

c string struct
1个回答
1
投票

strtok
不分配任何新内存。
car_1_name
car_2_name
都指向
string
内部的内存。
string
是一个局部变量,当
parse
退出时将被释放。然后,该内存可能会被覆盖,留下
car_1_name
car_2_name
指向垃圾。

您必须将 strtok 指针复制到新内存,可能使用

strdup

© www.soinside.com 2019 - 2024. All rights reserved.