选择结构的数据成员

Selecting data members of the structures

我正在尝试编写一个 C 程序,其中基于结构成员的大小,应该将许多成员读入数组。

正如您在下面的代码中看到的,根据 bookPtr->size 的值,我将向数组中添加那么多成员。

如果 bookPtr->size 是 3 ,我将读取所有成员 x,y 和 z。

如果 bookPtr->size 是 2 ,我将读取成员 x 和 y。

如果 bookPtr->size 为 1 ,我将读取成员 x。

如果 bookPtr->size 为 0 ,则不读取任何成员。

但我想通过某种方式优化代码 further.Is,使代码长度为 reduced.Thanks。

    #include<stdio.h>

    typedef struct
    {
        int x;  
        int y;
        int z;
        int size;
    }Book;



     void Get (Book* bookPtr)
    {
        Book mybook;
        int size = bookPtr->size;
        if(size == 3)
        {
        mybook->x = bookPtr->x;
        mybook->y = bookPtr->y;
        mybook->z = bookPtr->z;
        }

        else if(size == 2)
        {
            mybook->x = bookPtr->x;
            mybook->y = bookPtr->y; 
        }

        else if(size == 1)
        {
            mybook->x = bookPtr->x;
        }
        else
        {

        }

    }

    int main()
    {

        Book bookPtr;
        bookPtr.x =  2 ;
        bookPtr.y =  2 ;
        bookPtr.z =  20 ;   
        bookPtr.size = 2 ;

        Get(&bookPtr);
        return 0;

    }

你真的可以通过在结构中使用数组来优化代码, 但是,如果您不想更改结构代码,那么下面的代码看起来很酷。

void Get (Book* bookPtr)
{
    Book mybook;
    int size = bookPtr->size;
    if(--size >= 0) {
        mybook->x = bookPtr->x;
    } 
     if(--size >= 0){
        mybook->y = bookPtr->y; 
    }
    if(--size >= 0)
    {
        mybook->z = bookPtr->z;
    }
}

像这样

void Get (Book* bookPtr){
    Book mybook;
    switch(mybook.size = bookPtr->size){
    case 3: mybook.z = bookPtr->z;
    case 2: mybook.y = bookPtr->y;
    case 1: mybook.x = bookPtr->x;
            break;
    default:
        break;
    }
}

我建议将所有相关的 int 字段放在一个数组中。

#include<stdio.h>

struct Book {
    int data[3];
    int size;
};

void
Print(struct Book *p)
{
    int i, sz = p->size;
    for (i = 0; i < sz; ++i)
    {
        printf("data[%d] = %d\n", i, p->data[i]);
    }
    return;
}

void
Get(struct Book *p)
{
    int i, sz = p->size;
    struct Book mybook;

    mybook.size = sz;

    for (i = 0; i < sz; ++i)
    {
        mybook.data[i] = p->data[i];
    }

    Print(&mybook);

    return;
}


int
main(void)
{
    struct Book book;

    book.data[0] = 2;
    book.data[1] = 2;
    book.data[2] = 20;
    book.size = 2;

    Get(&book);

    return 0;
}

这意味着代码可以容纳任意数量的 int 字段以防将来需求发生变化,而不是假设存在三个名为 [=13= 的字段来感染代码的每个部分]、yzBook 结构中。