*****代码更新为新问题*****
我在从下面的列表中构建我想要输出的内容的第一个表时遇到了问题。
[这是输出看起来的照片][1](注意第一张表)
[这是我下面代码输出的屏幕截图][2]
我无法按每件商品的销售量排在第一位。
我的目标:
我正试图创建一个C程序来计算一家公司的总销售额,该公司从2个输入文件中收集数据并输出以下3件事:
1) 售出的物品数量按每个售出物品数量的降序列出,显示在一个标题为"物品编号"、"物品描述"one_answers"售出数量"的表格中。
2) 按总销售额的降序列出的每个项目的总销售额(总销售额=销售数量*单价)显示在一个标题为"项目编号"、"项目描述"、"销售数量"、"单价"one_answers"总销售额"的表中。
3) 总销售价值(上述第2项中每个总额的总和)
让我们获取原型声明
int readItemList(struct items[]);
在这里,您声明了一个函数readItemList
,它返回一个int
,并将一个指向struct item
的指针作为参数差不多但不是你想要的。
您想要的是函数将指针指向struct Item
(注意大写I
):
int readItemList(struct Item *items);
第二个错误是因为没有包含<string.h>
。
然而,这些只是编译器检测到的问题,您会遇到更严重的错误,这将导致未定义的行为,并且很可能在运行程序时导致崩溃:您使用了未初始化的局部变量。
在main
功能中,您有
//Creating dynamic array of structure
struct Item *items;
问题是你实际上并没有创造任何东西。您只需将未初始化的指针(这意味着其值不确定)传递给readItemList
函数,然后readItemList
将其视为已分配的数组。您在任何位置都不会为该指针分配内存。
最简单的解决方案是使items
成为main
函数中的数组:
struct Item items[200];
除非文件中有200个以上的项就足够了,否则您甚至可以缩小数组。
另一种解决方案是在将内存传递给readItemList
函数之前,在main
中为这些项动态分配内存。或者让readItemList
函数对其进行分配,但随后需要对其进行更改,以获取指向变量的指针,模拟通过引用,并根据需要让readItemList
进行分配和重新分配。
在原型中,您没有声明一个使用an array of struct Item
的函数。struct items[]
在这里没有任何合理的含义(没有像struct items
这样的结构。你必须使用struct Item items[]
,就像type identifier[]
一样。另一个例子可能是struct Item array_name[]
。对于strcmp
的问题,您需要包括string.h
。这就是它发出implicit declaration
警告的原因。