gpt4 book ai didi

c - 在纯 C 函数中使用字符串作为结构名称的可变部分

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:53 25 4
gpt4 key购买 nike

我在尝试减小代码大小时遇到​​了问题。我想做的是将 namecolor 传递给函数 writedata 这样我就不必为每种情况都写两次.

typedef struct Pet{
char* name;
char* color;
} pet;
void writedata(pet *Pet, char string[], const char field[]){
gets(string);
Pet->field= (char*)malloc(strlen(string)+1);//I wanted it to be treated like Pet->name
strcpy(Pet->field, string);
}

函数的调用:

 writedata(Pet, string, name);

我很确定我做错了什么。

更新:整个代码http://ideone.com/Y7L8Hu

update2:我尝试根据 BLUEPIXY 的建议使用 offset 来实现它,但似乎我误解了使用字段地址的操作......我认为问题可能是字段未初始化首先,但话又说回来,我的目标是初始化它们。

typedef struct Pet{
char* name;
int legs;
char* color;
} pet;
void writedata(pet *Pet, size_t FIELD){
char string[50];
gets(string);
(char*)Pet+offsetof(struct Pet, FIELD) = (char*)malloc(strlen(string)+1);//I wanted it to be treated like Pet->name
strcpy((char*)Pet+FIELD, string);
}

最佳答案

这不是 C 的工作方式。但是,我认为使用字符串比较可以实现你所需要的:

if (strcmp(field, "name") == 0)
{
Pet->name = ...
}
else if (strcmp(field, "color") == 0)
{
Pet->color = ...
}

并用字符串文字调用它:

writedata(Pet, string, "name");

使用 enum 也是一种选择。


顺便说一句,不要使用gets,这很危险,请改用fgets

关于c - 在纯 C 函数中使用字符串作为结构名称的可变部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24771001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com