调用一个结构数组,我会返回指针数组吗?

时间:2016-03-22 17:18:33

标签: c arrays struct

我有代码将数据存储到此结构中:

typedef struct sales{
    char *date;
    char *stockCode;
    int quantity;
} sales;

我通过此功能执行此操作:

void storeSales(FILE *salesf){
    struct sales sale[40000];
    char str[255];
    // counter for array position
    int counter = 0;
    while (fgets(str, 255, salesf) != NULL){
        counter++;
        char *date = strtok(str, " ,");
        char *stockCode = strtok(NULL, " ,");

        // store the
        sale[counter].date = malloc(strlen(date)+1);
        strcpy(sale[counter].date, date);

        sale[counter].stockCode = malloc(strlen(stockCode)+1);
        strcpy(sale[counter].stockCode, stockCode);

        sale[counter].quantity = atoi(strtok(NULL, "\n"));
    }
}

但现在存储的值我想使用它们。我当然可以将其添加到storeSales(FILE *salesf)函数中以打印它们:

   int count = 0;
     for(count =0; count <counter; count++){
        printf("%s %s %d \n", sale[count].date, sale[count].stockCode, sale[count].quantity);
    } 

但是当然有一个存储数据然后打印它们的功能并不是我想要的。

在我的主要内容中我希望能够访问这个结构数组,我已经读过你不能在函数中传回一个结构数组。

有没有办法返回一个指向结构的指针数组?

这对我来说都很新鲜!

我正在努力使我的代码尽可能模块化。

2 个答案:

答案 0 :(得分:0)

将您的功能更改为:void storeSales(FILE *salesf, struct* sale, int* counter);

然后你必须在main中分配你的数组并调用这个函数:

struct sales sale[40000];
int counter;
storeSales(salesf, sale, &counter);

然后你可以从main访问你的数组。

编辑:在storeSales功能中你必须注意不要离开阵列的bounderies!您可以通过将arraysize 40000存储在counter变量中来防止这种情况。并在storeSales中检查堆栈溢出。

答案 1 :(得分:0)

您已创建结构的typedef:

typedef struct sales{
    char *date;
    char *stockCode;
    int quantity;
} SALES; //caps make this stand out better

因为您已使用typedef

创建了结构
 struct sales sale[40000];

应创建为

sales sale[40000];

或与SALES(上限)

SALES sale[40000]; //this is a lot of structs (may be problematic)   

但要回答你的问题,如果你将原型改为:

void storeSales(FILE *salesf, SALES *s){

你可以调用它并像这样更新它:

int main(void)
{
    FILE *fp = fopen("somefile", "r");

    sale[0].date = malloc(20);
    sale[0].stockCode = malloc(20);

    storeSales(fp, sale);
    printf("date: %s\n Stock code: %s\n Quantity: %d\n", 
                 sale[0].date, sale[0].stockCode, sale[0].quantity);
    free(sale[0].date);
    free(sale[0].stockCode);
    return 0;   
}

void storeSales(FILE *f, SALES *s)
{
    ...

    strcpy(s[0].date, "some date"); 
    strcpy(s[0].quantity, "some quantity"); 
    s[0].stockCode=12345678;
    ...
}

请注意,该示例仅解决了您的问题:是否有办法返回指向结构的指针数组?,但您还应该问一些其他问题。 40000结构数组可能不是处理数据的最佳方法。此外,最好在发送之前为所有成员创建内存,显示的行只是为了说明这个概念。