C语言如何在main外的函数中修改struct结构体成员变量值
问题排查
struct Inventory定义在main函数内部,属于局部类型,外部函数无法识别该结构体格式,无法访问其成员变量- 零散定义10个独立的
part变量,没有统一索引结构,无法根据输入的零件编号快速定位对应结构体 addParts、removeParts未传入库存数据参数也无返回值,无法和main中的库存数据产生关联switch分支未加break,选择1会连续执行加库存、减库存逻辑,功能逻辑错误addParts中写了死循环while(1),触发功能后会一直停留在输入步骤,无法返回主菜单- 无输入合法性校验,输入不存在的零件编号、减库存时数量超过现有库存都会导致逻辑异常
修改方案
- 将
struct Inventory定义移到全局作用域,让所有函数都可以识别该类型 - 将10个零件改为结构体数组,通过下标即可快速对应零件编号(编号1对应下标0,以此类推)
- 给
addParts、removeParts增加参数:结构体数组指针、数组长度,函数内部通过指针即可直接修改原结构体的成员值,无需额外返回 - 补全
switch分支的break,去掉addParts的死循环,增加合法性校验逻辑
完整可运行代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 结构体移到全局,所有函数都可识别 struct Inventory { char name[15]; int num; int qty; }; // 加库存函数,传入结构体数组指针和数组长度 void addParts(struct Inventory *parts, int len) { int prt, num; printf("\nType the number of the part you wish to add: "); scanf("%d", &prt); // 校验零件编号合法性 if (prt < 1 || prt > len) { printf("\nINVALID PART NUMBER\n\n"); return; } printf("\nHow many parts would you like to add? "); scanf("%d", &num); if (num <= 0) { printf("\nINVALID ADD QUANTITY\n\n"); return; } // 直接修改对应结构体的库存值 parts[prt - 1].qty += num; printf("\nAdded %d %s, current stock: %d\n\n", num, parts[prt - 1].name, parts[prt - 1].qty); } // 减库存函数 void removeParts(struct Inventory *parts, int len) { int prt, num; printf("\nType the number of the part you wish to remove: "); scanf("%d", &prt); if (prt < 1 || prt > len) { printf("\nINVALID PART NUMBER\n\n"); return; } printf("\nHow many parts would you like to remove? "); scanf("%d", &num); if (num <= 0 || num > parts[prt - 1].qty) { printf("\nINVALID REMOVE QUANTITY\n\n"); return; } parts[prt - 1].qty -= num; printf("\nRemoved %d %s, current stock: %d\n\n", num, parts[prt - 1].name, parts[prt - 1].qty); } int main() { // 改成结构体数组,操作更方便 struct Inventory parts[10] = { {"Valve", 1, 10}, {"Bearing", 2, 5}, {"Bushing", 3, 15}, {"Coupling", 4, 21}, {"Flange", 5, 7}, {"Gear", 6, 5}, {"Gear Housing", 7, 5}, {"Vacuum Gripper", 8, 25}, {"Cable", 9, 18}, {"Rod", 10, 12} }; const int PART_COUNT = sizeof(parts) / sizeof(parts[0]); while (1) { int response; printf("-------------------------\n" " INVENTORY\n" "PART QTY\n" "-------------------------\n"); // 用循环打印库存,不用写10行重复代码 for (int i = 0; i < PART_COUNT; i++) { printf("%d. %-15s | %d \n", parts[i].num, parts[i].name, parts[i].qty); } printf("-------------------------\n"); printf("Would you like to 1-Add Parts, 2-Remove Parts, or 3-Quit? "); scanf("%d", &response); // 每个case加break switch(response) { case 1: addParts(parts, PART_COUNT); break; case 2: removeParts(parts, PART_COUNT); break; case 3: break; default: printf("\nINVALID INPUT\n\n"); // 清空输入缓冲区,避免异常输入导致死循环 while(getchar() != '\n'); break; } if (response == 3) { break; } } return 0; }
内容的提问来源于stack exchange,提问作者Der Noobermeister
相关产品推荐
相关产品推荐

