【问题标题】:Selecting data members of the structures选择结构的数据成员
【发布时间】:2017-06-20 16:57:22
【问题描述】:

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

正如你在下面的代码中看到的那样,基于bookPtr->size的值,我会将那么多成员添加到数组中。

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

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

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

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

但是我想进一步优化代码。有没有办法减少代码长度。谢谢。

    #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;

    }

【问题讨论】:

标签: c pointers structure


【解决方案1】:

喜欢这个

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;
    }
}

【讨论】:

  • 他BLUEPIXY,谢谢你的回答。但我恐怕你的解决方案不正确。这里如果大小为 3 ,它只复制z,而不复制x和y。
  • @GopalKrishna 如果break;没有写在switch-case语句中,则执行下面的case语句。
  • 哦!我明白了。谢谢老兄。
【解决方案2】:

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

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;
    }
}

【讨论】:

  • 嗨,Amal,感谢您的回答。是的,我同意使用数组,代码可以优化。但我想知道在这种情况下如何完成。三元运算符可以提供帮助吗?
  • 不,我不认为三元运算符可以在这种情况下提供帮助。如果你有什么请让我知道。
【解决方案3】:

我建议将所有相关的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字段,以防将来需求发生变化,而不是假设存在三个名为xy、和zBook 结构中。

【讨论】:

  • Hi Sinan,感谢您的回答。是的,我同意使用数组,代码可以优化。但我想知道在这种情况下如何完成。还有其他选择吗?
猜你喜欢
  • 2014-12-06
  • 1970-01-01
  • 2011-12-23
  • 2017-05-20
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
相关资源
最近更新 更多