You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:09