我的文件中有一个汽车列表,其中行的形式为
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;
}
你能告诉我我做错了什么吗?
strtok
不分配任何新内存。 car_1_name
和car_2_name
都指向string
内部的内存。 string
是一个局部变量,当parse
退出时将被释放,留下car_1_name
并且car_2_name
将指向垃圾。
strdup
。