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

标签 c string function struct c-preprocessor

我在尝试减小代码大小时遇到​​了问题。我想做的是将 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/

相关文章:

通过 fork() 在 C 中创建多个进程和模拟

C# 使用强制转换将 Int64 转换为字符串

python - 函数调用python中的表达式吗?

c++ - C++编译器错误,从单词中删除字母

c++ - 什么会导致返回函数崩溃? C++

c - Linux 上的退出函数

c - 能够从未初始化的结构指针数组打印预期结果 - 困惑

c - 如何用C语言打开任意长度的文件?

python - 如何获取域名后面的url路径

c++ - 如何在不删除的情况下将\x1\x2\x3 ...字符转换为普通字符?