我不确定这是否是使用值创建和初始化结构的正确方法:
#define LINES 4
#define LENGHT 30
typedef struct
{
char *name;
char *phoneNumber;
char *location;
char *traveltype;
} Client;
void readClientData(char *filename, char *clientData[]);
Client *createClient(char *name, char *phoneNumber, char *location, char *traveltype);
int main(int argc, char *argv[])
{
char *filename = argv[1];
char *clientData = (char *)malloc(LINES * sizeof(char)*LENGHT);
readClientData(filename, &clientData);
Client *client = createClient(clientData[0], clientData[1], clientData[2], clientData[3]);
return 0;
}
Client *createClient(char *name, char *phoneNumber, char *location, char *traveltype)
{
Client *client = malloc(sizeof(Client));
client->name = strdup(name);
client->phoneNumber = strdup(phoneNumber);
client->location = strdup(location);
client->traveltype = strdup(traveltype);
return client;
}
我正在尝试创建我的结构,但出现以下错误:
error: invalid conversion from 'char' to 'char*' [-fpermissive]
Client *client = createClient(clientData[0], clientData[1], clientData[2], clientData[3]);
error: invalid conversion from 'void*' to 'Client*' [-fpermissive]
Client *client = malloc(sizeof(Client));
我在这里想念什么?
由于clientData
是char *
,所以clientData[i]
是简单字符。这与createClient ()
原型冲突,该原型期望指向以NULL终止的字符串的字符的指针。
请注意,在分配它们之后,您将永远不会对其进行初始化。这在运行时将是一个问题,因为strdup ()
需要复制一些内容(至少是一个空字符串!)。
第二个错误要求您将malloc的结果强制转换为Client *
(即使在很多情况下也可能会告诉您避免它,许多编译器都需要它。)>
读取和创建操作可以合并。然后,在读取文件时,可以使用realloc
增加客户端的数量。分配一个额外的结构以充当哨兵。或跟踪分配的结构数。对于每种结构,请尝试从文件中读取四行,然后将strdup
行读取到结构指针。