Redian新闻
>
{C语言}请教如何通过变量访问结构体内的各个属性
avatar
{C语言}请教如何通过变量访问结构体内的各个属性# Programming - 葵花宝典
p*c
1
小弟最近在做c开发,很多基本概念头痛不已,放狗搜过,没找到答案,身边也没有可
以问的人,希望各位前辈可以不吝请教。
比如说,我有个结构体
typedef struct{
int a;
int b;
int c;
}config_struct;
有个变量指针char *shuxing;
应该怎么写,才可以通过这个指针访问到config_struct里的属性?
比如说
shuxing = "a"的时候,可以访问到 config_struct->a ,
shuxing = "b"的时候,可以访问到 config_struct->b ,
我知道如果是php和java,这很容易做到,但是c语言真心不知道怎么弄。
谢谢
avatar
d*i
2
Easy, use strcmp:
if(strcmp("a", shuxing) == 0) {
your_struct_ptr->a;
} else if(strcmp("b", shuxing) ==0) {
your_struct_ptr->b;
} else if(strcmp("c", shuxing) == 0) {
your_struct_ptr->c;
}

【在 p*****c 的大作中提到】
: 小弟最近在做c开发,很多基本概念头痛不已,放狗搜过,没找到答案,身边也没有可
: 以问的人,希望各位前辈可以不吝请教。
: 比如说,我有个结构体
: typedef struct{
: int a;
: int b;
: int c;
: }config_struct;
: 有个变量指针char *shuxing;
: 应该怎么写,才可以通过这个指针访问到config_struct里的属性?

avatar
h*c
3
your struture can use GHashTable
avatar
s*i
4
用Union 建一个int数组和struct共享内存
再用*shuxing减去'a'作为index即可
avatar
w*g
5
想了一圈,还是觉得你的答案最好.

【在 d****i 的大作中提到】
: Easy, use strcmp:
: if(strcmp("a", shuxing) == 0) {
: your_struct_ptr->a;
: } else if(strcmp("b", shuxing) ==0) {
: your_struct_ptr->b;
: } else if(strcmp("c", shuxing) == 0) {
: your_struct_ptr->c;
: }

avatar
h*c
6
我老认为玩玩宏是可能的,周末找时间试试

【在 p*****c 的大作中提到】
: 小弟最近在做c开发,很多基本概念头痛不已,放狗搜过,没找到答案,身边也没有可
: 以问的人,希望各位前辈可以不吝请教。
: 比如说,我有个结构体
: typedef struct{
: int a;
: int b;
: int c;
: }config_struct;
: 有个变量指针char *shuxing;
: 应该怎么写,才可以通过这个指针访问到config_struct里的属性?

avatar
h*c
7
Thanks,
heteroclinic,您好:
powerrc 转给您,现金(伪币): 20 .
avatar
c*3
8
*(((int *)&config_struct->a) + (shuxing - 'a'))
有点猥琐,做考试还行,实际代码最好别用
avatar
h*c
9
其实dot是可以overload的,或者在struct重新定义一个
.() (string s) operator,然后把下段加进去

如果是自己从头干,觉得这种config用个static map 或table 比较好,难搞的是一大
堆老库,第三方库。c 的 struct就是 cpp的 class,区别是没有private, public 等。
那么办法就是 继承这些structure,适当加一些新的内容。
这里再加点我个人的私货,一般一些项目开始都吹自己搞了什么新东西,要把以前的东
西统统推翻,这些项目出不了两年成了旧项目的时候,别人想接手几乎是天方夜谭。 r
u sober?
相反一个项目开始就注意工具材料,工程设计的起承转合,看起来麻烦琐屑“简单”,
后面的人接手起来更容易。 add value to the society.

【在 d****i 的大作中提到】
: Easy, use strcmp:
: if(strcmp("a", shuxing) == 0) {
: your_struct_ptr->a;
: } else if(strcmp("b", shuxing) ==0) {
: your_struct_ptr->b;
: } else if(strcmp("c", shuxing) == 0) {
: your_struct_ptr->c;
: }

avatar
d*a
10

如果要反复访问这样的数据结构,这样做的效率会比较差。
比较常用的作法,是用一个带union的结构,并且预先把字符串转换成enum类型。
typedef struct {
enum {
A, B, C
} type;
union {
int a;
int b;
int c;
} data;
} config_struct;

【在 w***g 的大作中提到】
: 想了一圈,还是觉得你的答案最好.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。