C 调用结构数组时,是否返回指针数组?
我有代码将数据存储到此结构中:C 调用结构数组时,是否返回指针数组?,c,arrays,struct,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 (f
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"));
}
}
我通过此功能执行此操作:
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);
}
int count=0;
对于(count=0;count将函数更改为:void storeSales(FILE*salesf,struct*sale,int*counter);
然后,您必须在main中分配数组,并按如下方式调用函数:
struct sales sale[40000];
int counter;
storeSales(salesf, sale, &counter);
然后您可以从主服务器访问阵列
编辑:在storeSales函数中,您必须注意不要离开数组的边界!您可以通过将arraysize 40000存储在计数器
变量中来防止这种情况。并在storeSales中使用它来检查堆栈溢出。您已经创建了结构的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];
或销售(上限)
但为了回答您的问题,如果您将原型更改为:
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结构数组可能不是处理数据的最佳方法。此外,最好在发送行之前为所有成员创建内存图中所示的只是为了说明这个概念。C不支持方法,只支持函数。是的,很抱歉,我的意思是函数@OlafEither调用函数分配空间,并让被调用函数知道它可以使用多少空间(它向被调用函数传递指针和数组大小),或被调用函数分配空间,调用函数传递指向指针的指针和指向大小的指针,以便被调用函数可以告诉调用函数它有多少空间(被调用函数)“已分配和位置”。@JonathanLeffler:作为第三种选择,可以按OP的字面要求返回指针。@Olaf:可以,然后您必须担心如何知道数组有多大。如果最后一个条目使用空指针,您可以这样做;否则,您可以通过指针到大小参数返回指针。或者您可以使用struc用指针和大小作为元素并返回的类型。或者…为什么?对我来说,这似乎是一种不太模块化的方法?至少这是一种不好的方法。最坏的情况是它会导致堆栈溢出。你必须至少在main中定义数组,然后才能在storeSales中分配它。但我不推荐这样做,因为这样会导致堆栈溢出你必须自己处理解除分配。有关这方面的更多信息,请查看你问题下评论中发布的链接@Olaf。“你必须至少在main中定义数组”-不。还有其他多种方法。无论如何,这是一个明确的dup,应该在早晚关闭。C中为数不多的几种常用命名约定之一是仅对宏和枚举常量使用所有大写名称(即,您可以在C代码中使用的唯一符号常量)@Olaf-你的评论很有帮助。如果你能就如何改进提出建议,那将更有帮助。我应该注意到,在我工作的行业(医疗、航空航天)中,我们通常使用大写字母除了您提到的项目之外,还要区分typedefed结构。这不会造成混淆,因为根据上下文它们总是可以区分的。奇怪。我有时在同一个领域工作,但从未遇到过这样的要求。通常我的客户使用与我相同的方法:驼峰格。也许您的是一些遗留问题(请参见文件
).LOL,是的,我维护了很多旧代码。CamelCase常用于我的变量和函数名。我见过它们(以及大写结构typedefs)自从我开始编程以来,我很小心地不使用StructName\u t,因为我知道这个符号是用在一些神圣的地方的,但是在这篇文章中,如果你认为它会增加概念的清晰性,我会很乐意更改它。不管怎样,这对我来说都不是一个论点。一个评论并不一定意味着你必须遵循它。事实上,我非常肯定听说它真的是这样使用的,我很高兴。我认为它(与我的第一个评论一致)不寻常(这两个行业都以落后于现代开发技术而闻名)。你想怎么做就怎么做吧。