C++如何将输入的存档码字符串按固定长度拆分赋值给整型变量
C++实现8位存档码按2位分段赋值玩家属性
你原代码的核心问题是用int类型接收存档码输入:一方面存档码长度稍大就会触发整数溢出,另一方面数值类型无法直接按固定字符长度分段,直接用字符串接收输入是最稳妥的实现方案。
实现逻辑
- 将原代码中
int PlayerSaveName替换为std::string类型,接收用户输入的完整存档码字符串 - 增加基础输入校验:判断输入存档码长度是否为8位(4组属性每组占2位),长度不符直接提示无效,避免读入脏数据
- 从字符串起始位开始,每2位截取一个子串,转换为整型后依次赋值给等级、最大生命值、最大护甲、攻击力四个变量
修改后可直接运行的代码
记得在文件头引入<string>头文件支持字符串操作,原有其他逻辑保持不变即可:
#include <string> #include <iostream> #include <cstdlib> // 给system函数提供支持 // 其他你原有项目需要的头文件保留即可 int PLRlvl; // 玩家等级 int PLRmhp; // 最大生命值 int PLRmap; // 最大护甲 int PLRdmg; // 攻击力 int Data_GamePhase; // 原有全局变量保留 void SelectSave() { Data_GamePhase = 2; WindowTitle(); system("cls"); std::cout << "Enter your save code.\n"; std::cout << "Code: "; // 用字符串接收存档码输入 std::string saveCode; std::cin >> saveCode; // 长度校验:标准存档码固定为8位 if (saveCode.length() != 8) { std::cout << "存档码无效,请输入8位正确格式的存档码!\n"; return; } // 按每2位一组拆分转int赋值 // substr第一个参数为截取起始位置,第二个参数为截取长度 PLRlvl = std::stoi(saveCode.substr(0, 2)); // 取前2位:第1-2个字符 PLRmhp = std::stoi(saveCode.substr(2, 2)); // 取第3-4个字符 PLRmap = std::stoi(saveCode.substr(4, 2)); // 取第5-6个字符 PLRdmg = std::stoi(saveCode.substr(6, 2)); // 取最后2位:第7-8个字符 // 后续读档成功后的跳转、逻辑处理写在这里即可 }
扩展提示:如果后续要加长存档码、新增存档属性,只要按相同规则调整
substr的起始位置和截取长度即可。如果要做更严谨的校验,可以额外加一步判断输入字符是否全为数字,避免用户输入字母、符号时转整型报错。
内容的提问来源于stack exchange,提问作者TheGamingDolpghin
相关产品推荐
相关产品推荐

