这怎么修改##二维数组

img

img


.cpp



```c++
#include "Hero.h"
#include <string.h>
#include <iostream>
using namespace std;
bool PickGoods(Hero& hero, Goods goods)
{
    //判断背包是否已满
    if (hero.MyBag.Size <Num)
    {
        //把物品添加到数组末尾
        //拷贝拾取物品的属性 memcpy
        //memcpy(&hero.MyBag.MyGoods[hero.MyBag.Size], &goods, sizeof(Goods));
        hero.MyBag.MyGoods[hero.MyBag.Size].Id = goods.Id;
        hero.MyBag.MyGoods[hero.MyBag.Size].AddNum = goods.AddNum;
        strcpy_s(hero.MyBag.MyGoods[hero.MyBag.Size].Name, goods.Name);
        ++hero.MyBag.Size;
        return true;
    }
    return false;
}
//打开背包
void OpenBag(const Hero& hero)
{
    cout << "编号\t物品名称\t属性值\n";
    //遍历背包中所有物品:并显示其属性
    for (int i = 0; i < hero.MyBag.Size; i++)
    {
        cout << i + 1 << "\t" << hero.MyBag.MyGoods[i].Name << "\t\t" << hero.MyBag.MyGoods[i].AddNum << endl;

    }
}
void UseGoods(Hero& hero, int Index)
{
    //数组是否越界
    if (Index >= 0 && Index < hero.MyBag.Size)
    {
        //增加玩家对应的属性值
        if (1 == hero.MyBag.MyGoods[Index].Id)
        {
            hero.Hp += hero.MyBag.MyGoods[Index].AddNum;
        }
        //使用的物品的后面所有物品前移一位
        for (int i = Index + 1; i < hero.MyBag.Size; i++)
        {

            hero.MyBag.MyGoods[i - 1].Id = hero.MyBag.MyGoods[i].Id;
            hero.MyBag.MyGoods[i - 1].AddNum = hero.MyBag.MyGoods[i].AddNum;
            strcpy_s(hero.MyBag.MyGoods[i - 1].Name, hero.MyBag.MyGoods[i].Name);

        }
        --hero.MyBag.Size;//物品数量-1
    }
}

```

Hero.h
里面怎么写的,是不是函数实现写里面了
并且没有 #program once
导致重复定义

问题解决了吗?需要远程协助吗

【以下回答由 GPT 生成】

问题标题: 如何修改二维数组?

问题内容: 我想知道如何修改一个二维数组的内容。以下是我目前的代码:

#include "Hero.h"
#include <string.h>
#include <iostream>
using namespace std;

bool PickGoods(Hero& hero, Goods goods)
{
    // 判断背包是否已满
    if (hero.MyBag.Size < Num)
    {
        // 把物品添加到数组末尾
        // 拷贝拾取物品的属性 memcpy
        // memcpy(&hero.MyBag.MyGoods[hero.MyBag.Size], &goods, sizeof(Goods));
        hero.MyBag.MyGoods[hero.MyBag.Size].Id = goods.Id;
        hero.MyBag.MyGoods[hero.MyBag.Size].AddNum = goods.AddNum;
        strcpy_s(hero.MyBag.MyGoods[hero.MyBag.Size].Name, goods.Name);
        ++hero.MyBag.Size;
        return true;
    }
    return false;
}

// 打开背包
void OpenBag(const Hero& hero)
{
    cout << "编号\t物品名称\t属性值\n";
    // 遍历背包中所有物品:并显示其属性
    for (int i = 0; i < hero.MyBag.Size; i++)
    {
        cout << i + 1 << "\t" << hero.MyBag.MyGoods[i].Name << "\t\t" << hero.MyBag.MyGoods[i].AddNum << endl;
    }
}

void UseGoods(Hero& hero, int Index)
{
    // 数组是否越界
    if (Index >= 0 && Index < hero.MyBag.Size)
    {
        // 增加玩家对应的属性值
        if (1 == hero.MyBag.MyGoods[Index].Id)
        {
            hero.Hp += hero.MyBag.MyGoods[Index].AddNum;
        }
        // 使用的物品的后面所有物品前移一位
        for (int i = Index + 1; i < hero.MyBag.Size; i++)
        {
            hero.MyBag.MyGoods[i - 1].Id = hero.MyBag.MyGoods[i].Id;
            hero.MyBag.MyGoods[i - 1].AddNum = hero.MyBag.MyGoods[i].AddNum;
            strcpy_s(hero.MyBag.MyGoods[i - 1].Name, hero.MyBag.MyGoods[i].Name);
        }
    }
}

我想修改 PickGoods 函数中的代码,以使用更安全的函数替代 strcpy_smemcpy 函数。同时,我还要修改 UseGoods 函数中的代码,以正确移动数组中的元素。请给予一些建议和解决方案。

解决方案

  1. 使用strncpy函数替代strcpy_s函数,因为strncpy函数可以限制拷贝的最大长度,从而避免缓冲区溢出的风险。使用时,将原本的strcpy_s替换为strncpy,并指定拷贝的最大长度。

修改后的 PickGoods 函数示例:

bool PickGoods(Hero& hero, Goods goods)
{
    // 判断背包是否已满
    if (hero.MyBag.Size < Num)
    {
        // 把物品添加到数组末尾
        // 拷贝拾取物品的属性 memcpy
        // memcpy(&hero.MyBag.MyGoods[hero.MyBag.Size], &goods, sizeof(Goods));
        hero.MyBag.MyGoods[hero.MyBag.Size].Id = goods.Id;
        hero.MyBag.MyGoods[hero.MyBag.Size].AddNum = goods.AddNum;
        strncpy(hero.MyBag.MyGoods[hero.MyBag.Size].Name, goods.Name, sizeof(hero.MyBag.MyGoods[hero.MyBag.Size].Name) - 1);
        hero.MyBag.MyGoods[hero.MyBag.Size].Name[sizeof(hero.MyBag.MyGoods[hero.MyBag.Size].Name) - 1] = '\0';
        ++hero.MyBag.Size;
        return true;
    }
    return false;
}
  1. 使用数组元素赋值的方式代替循环移动数组元素的方式,以提高代码的简洁性和可读性。

修改后的 UseGoods 函数示例:

void UseGoods(Hero& hero, int Index)
{
    // 数组是否越界
    if (Index >= 0 && Index < hero.MyBag.Size)
    {
        // 增加玩家对应的属性值
        if (1 == hero.MyBag.MyGoods[Index].Id)
        {
            hero.Hp += hero.MyBag.MyGoods[Index].AddNum;
        }
        // 使用的物品的后面所有物品前移一位
        for (int i = Index; i < hero.MyBag.Size - 1; i++)
        {
            hero.MyBag.MyGoods[i] = hero.MyBag.MyGoods[i + 1];
        }
        --hero.MyBag.Size;
    }
}

这样,你就安全地修改了 PickGoodsUseGoods 函数中的代码,使用了更安全的函数并正确地移动了数组元素。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^