我有代码将数据存储到此结构中:
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);
}
但是当然有一个存储数据然后打印它们的功能并不是我想要的。
在我的主要内容中我希望能够访问这个结构数组,我已经读过你不能在函数中传回一个结构数组。
有没有办法返回一个指向结构的指针数组?
这对我来说都很新鲜!
我正在努力使我的代码尽可能模块化。
答案 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结构数组可能不是处理数据的最佳方法。此外,最好在发送之前为所有成员创建内存,显示的行只是为了说明这个概念。