如何使用具有元素名称的变量来访问结构的元素?

时间:2012-11-27 09:01:47

标签: c struct

我不确定这是否至少是可能的,但我想使用具有该元素的确切名称的变量来访问我的结构中的元素。

我的程序对结构的成员进行操作,它取决于用户选择的列,但是为了使它更简单(因为那不是主要的点)我将写一些简单的行,所以它会是这样的:

(假设我已经用另一个函数填写了列表,但这不是主要的观点,所以我不会把它放在一起)

该结构,将用于双向链表的每个节点(每个节点表示来自具有两列的表中的一行)

typedef struct row {
    float A, B;
    struct row *prev, *next;
} _row;

主要

int main(){
    char column;
    printf("Which column would you like to see? (A or B):  ");
    scanf("%c",&column);
    show_column(column);
    system("PAUSE");
}

功能

void show_column(char column){
    _row *aux;
    aux=start;
    while(aux->next!=NULL){
        printf("\n %.2f",aux->column);
        aux=aux->next;
    }
    //this is because that cycle is not going to show the last node
    printf("\n %.2f",aux->column);
}

“start”也是_row。它被修改为从列表开始指向插入节点的同一函数。

我想知道的是如何在函数中创建这个部分:

printf("\n %.2f",aux->column);

因为“column”不是结构中的成员,而是一个应该包含其中一个成员(A或B)的名称的变量。

我需要这个,所以我不必重复相同的代码,但使用“if”和只有一个字母(B)不同。

对不起,如果拼写和语法有问题,我的英语不是很好,非常感谢你的帮助!

4 个答案:

答案 0 :(得分:1)

C不是解释而是编译语言。据我所知,这是不可能的。你必须编写额外的代码。 此外,对于简单的用户来说,知道结构字段的名称并不好 - 所以,不要担心=)。

答案 1 :(得分:1)

所以基本上用户给你'A',你想要列A.
如果只是一个单个字符的情况,那么你可以只使用字母后面的int 使你的浮动像这样的数组:

typedef struct row {
float col[2];    //A, B
struct row *prev, *next;
} _row;

然后改变

printf("\n %.2f",aux->column);

成为

printf("\n %.2f",aux->col[(int(toUpper(column) - 'A'))]);

所以'A'将变为0,
'B'将变为1等。
这只适用于单字符列名,因此如果你想要一个“AA”列,这将不会有任何修改。

答案 2 :(得分:0)

你可以做printf("\n %.2f",(*(aux->column) == 'A' ? aux->A : aux->B));我不知道你怎么能用if语句以另一种方式做到这一点。

答案 3 :(得分:0)

也许你可以这样做:

typedef struct row {
    float col[2];
    struct row *prev, *next;
} _row;

int main(){
    char column;
    printf("Which column would you like to see? (A or B):  ");
    scanf("%c",&column);
    show_column(column);
    system("PAUSE");
}

void show_column(char column){
    _row *aux;
    aux=start;

    column = column - 'A';
    while(aux->next!=NULL){
        printf("\n %.2f",aux->col[column]);
        aux=aux->next;
    }
    //this is because that cycle is not going to show the last node
    printf("\n %.2f",aux->col[column]);
}