如何处理用C语言填充结构

时间:2018-07-18 04:50:47

标签: c

我在理解如何调用信息并将信息存储到结构中时遇到问题。

typedef struct {
    char ticker[10];
    double price;
} StockPrice;

typedef struct {
    char ticker[10];
    double shares;
} Stock;


typedef struct {
    Stock myStocks[MAX_MY_STOCKS]; // MAX_MY_STOCKS is five.
    double balance;
} Portfolio;

我不知道该怎么写,但是我正在处理一个结构,其中包含另一种类型的结构,想知道在用C语言编写时如何填充和打印该结构。

3 个答案:

答案 0 :(得分:1)

  

如何调用信息并将信息存储到结构中

您不会调用结构。您访问它。我了解(假设)您是C语言的初学者,可以使用最初的错误术语,但是继续进行,您需要了解一些知识,以便至少可以解释您的问题:-)

typedef struct {
    char ticker[10];
    double price;
} StockPrice;

typedef struct {
    char ticker[10];
    double shares;
} Stock;

typedef struct {
    Stock myStocks[MAX_MY_STOCKS]; // MAX_MY_STOCKS is five.
    double balance;
} Portfolio;

您需要的第一件事是Portfolio类型的对象。

Portfolio myPortfolio;

现在您有了结构的对象。 要访问(读取和写入)结构成员,可以使用.运算符。

所以

myPortfolio.balance = 12.35;

balance的值设置为12.35。 同样,如果要在shares的3 rd 索引中设置myStock的值,则可以执行以下操作:

myPortfolio.myStock[3].shared = 111.222;

首先,您需要了解如何以及何时使用.->运算符。 C11标准对此有足够的信息。尽管一开始提到标准可能会非常混乱,因为可能不熟悉这些术语,但确实有帮助。
通读stucture and union members部分以了解C标准的规定。

因此,编写和读取这些值的代码很糟糕:

#include<stdio.h>

#define MAX_MY_STOCKS   5

typedef struct {
    char ticker[10];
    double price;
} StockPrice;

typedef struct {
    char ticker[10];
    double shares;
} Stock;

typedef struct {
    Stock myStocks[MAX_MY_STOCKS]; // MAX_MY_STOCKS is five.
    double balance;
} Portfolio;

Portfolio myPortfolio;

void PrintPortfolio(unsigned int Index)
{
    int i = 0;
    if(Index >= MAX_MY_STOCKS)
    {
        printf("\n\n\nStock overflow :D");
        return;
    }

    printf("\n\n\n");    

    for (i = 0; i < 10; i++)
    {
        printf("\nticker %d in myStock[%d] is %X", i, Index, myPortfolio.myStocks[Index].ticker[i]);    
    }

    printf("\nshares in myStock[%d] is %lf", Index, myPortfolio.myStocks[Index].shares);
}

int main(void) 
{
    myPortfolio.balance = 12.34;
    myPortfolio.myStocks[3].shares = 111.222;

    printf("My portfolio balance is %lf", myPortfolio.balance);

    for(int i = 0; i < (MAX_MY_STOCKS+1); i++)   // The deliberate extra iteration, a bit of a pun! :D
    {
        PrintPortfolio(i);
    }

    printf("\n\n\n Lets use a pointer!");
    Portfolio *pmyPortfolio;
    pmyPortfolio = &myPortfolio;
    printf("\n\nMy portfolio balance is %lf", pmyPortfolio->balance);
    return 0;
}

希望这会有所帮助!

答案 1 :(得分:1)

由于WedaPashi并未介绍使用值进行初始化,因此我将简要说明。声明结构后

StockPrice sp;

然后,该结构中的所有变量现在都有一部分内存。现在,所有这些变量都具有“垃圾值”,这意味着它们可以是任何可能的值,我们无法可靠地知道什么。如他的回答所述,您可以使用“。”访问值。为了给它们赋值,例如

sp.price = 12.35;

您可以用相同的方式初始化数组,所以我们可以说

sp.ticker = {'t','i','c','k','e','r','V','A','L'};

或者在char数组的特殊情况下,我们可以简单地说

sp.ticker = "tickerVal";

或者您可以一次初始化结构中的所有值,例如

StockPrice sp = {"tickerVal", 99.35};

此时sp.price等于99.35,并且代码包含字符串“ tickerVal”。 重要的是要注意,一旦在结构中设置了至少一个变量的值,那么所有其他尚未分配值的变量都将获得默认值。换句话说,一旦您设置了至少一个变量,就不会再有“垃圾值”了。

如果我们想把所有这些放在一起只是为了给您一个更复杂的初始化的想法,我们可以这样说:

Portfolio p = { 
    /*first value is an array initialization of stocks*/
    {
        {"ticker0\0",0.0},     /*stock structs*/
        {"ticker1\0",1.0},     /*stock structs*/
        {"ticker2\0",2.0},     /*stock structs*/
        {"ticker3\0",3.0},     /*stock structs*/
        {"ticker4\0",4.0},     /*stock structs*/
        {"ticker5\0",5.0},     /*stock structs*/
        {"ticker6\0",6.0},     /*stock structs*/
        {"ticker7\0",7.0},     /*stock structs*/
        {"ticker8\0",8.0},     /*stock structs*/
        {"ticker9\0",9.0}      /*stock structs*/
    },/*end of array of Stock*/
    /*second value is double balance*/
    100.99
};

答案 2 :(得分:1)

  #include <stdio.h>
#include <string.h>

int main(void) {
    // filling by initialisation in source code:
    Stock a = { .ticker = "Whatever" // caution: You only have *nine* characters;
              , .shares = 0.0                 // you need the string terminator...
              };
    printf("Stock a has ticker %s and shares %f\n", a.ticker, a.shares);

    // classic reassignment:
    // you don't want to know...

    // classic reassignment v1.5:
    snprintf(a.ticker, sizeof a.ticker, "%s", "Meh");
    a.shares = 42.0;

    // reassignment v2:
    a = (Stock){ "under ten", -1. }; // as in "under ten" characters long!

    // reassignment v2.5
    a = (Stock){ .shares = 9001.
               , .ticker = "to the moon" // Zap! Nine characters or less, remember?!
               };

    // read from console:
    while (scanf("%9[^ ] %lf", a.ticker, &a.shares) == 2) {
        printf("You entered the ticker: { %9s, %lf }\n", a.ticker, a.shares);
    }
}