```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_s
和 memcpy
函数。同时,我还要修改 UseGoods
函数中的代码,以正确移动数组中的元素。请给予一些建议和解决方案。
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;
}
修改后的 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;
}
}
这样,你就安全地修改了 PickGoods
和 UseGoods
函数中的代码,使用了更安全的函数并正确地移动了数组元素。
【相关推荐】