如何将直接初始化的PRODUCT结构体对象加入库存数组并在报表展示
问题解答
疑问回复
- 能不能用
PRODUCT hammer = {"Hammer", 1234, 5.50, 8.99, 4};这种方式创建库存商品?
可以,这是C语言结构体的聚合初始化语法,是标准合法的结构体变量创建方式,适合初始化时所有字段值都明确的场景。 - 这种方式比调用函数创建的效率更高吗?
是的,聚合初始化是编译期完成字段赋值,不需要运行期逐行调用strcpy、逐行给字段赋值,没有额外的函数调用开销,运行效率更高,代码也更简洁。 - 怎么把这个hammer对象纳入现有库存流程,打印到报表里?
你只需要把已经初始化好的hammer变量完整复制到inventory数组的空闲位置,再给effectiveSize加1即可。C语言允许同类型的结构体直接用=赋值,内部的数组成员也会自动完成逐字节拷贝,不需要你手动调用strcpy复制name字段,不会出错。
可运行示例代码
我同时优化了原有fillInProducts函数的写法,用复合字面量替代逐行赋值,更简洁不易出错:
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char name[40]; short int number; double wholesale; double retail; short int onHand; } PRODUCT; void fillInProducts(PRODUCT[], int* pSize); void inventoryReport(PRODUCT[], int*); int main() { // 用聚合初始化创建hammer商品 PRODUCT hammer = {"Hammer", 1234, 5.50, 8.99, 4}; PRODUCT inventory[500]; int effectiveSize = 0; // 将hammer加入库存数组 inventory[effectiveSize] = hammer; effectiveSize++; fillInProducts(inventory, &effectiveSize); inventoryReport(inventory, &effectiveSize); return 0; } void fillInProducts(PRODUCT inventory[], int* pSize) { // 用复合字面量直接赋值,替代逐行赋值写法 inventory[*pSize] = (PRODUCT){"手锯", 3456, 12.34, 23.99, 12}; (*pSize)++; inventory[*pSize] = (PRODUCT){"测试商品2", 3457, 12.34, 23.99, 12}; (*pSize)++; } void inventoryReport(PRODUCT inventory[], int *pSize){ int i = 0; printf(" 库存报表 \n"); printf(" ======== \n\n"); printf(" 商品名 商品编号 库存数 批发价 零售价\n"); printf(" ========= ======== ======= ======= =======\n"); for (i = 0; i < *pSize; i++) { printf("%10s %10d %8d %10.2lf %10.2lf\n", inventory[i].name, inventory[i].number, inventory[i].onHand, inventory[i].wholesale, inventory[i].retail); } }
运行后即可看到Hammer出现在库存报表第一行,和其他商品一起正常展示。
内容的提问来源于stack exchange,提问作者Fefs
相关产品推荐
相关产品推荐

