C++中std::string数字字符参与算术运算出现48偏移问题求解
问题根源
你遇到的48是字符'0'的ASCII编码值,这是C++中char类型参与运算的默认规则导致的:
std::string的每个元素都是char类型,直接用std::cout输出char时,会打印它对应的可见字符,所以'1'会直接输出1符合你的预期- 当
char类型和int类型做算术运算、比较运算时,char会自动提升为int类型,使用它的ASCII编码值参与计算:'0'对应48、'1'对应49,以此类推,自然就出现了“数值等于48加对应数字”的现象。
解决方法
将字符型的数字转换为对应的整数值再参与运算即可,利用ASCII中数字字符连续编码的特性,减去'0'的编码值就行:
// 在switch逻辑之前先做转换 int move_digit = move[1] - '0';
后续所有需要用move[1]做数值比较、计算的位置,全部替换为move_digit即可,比如你的判断条件改成if (spaces[a][i] == move_digit)就会按预期工作了。
代码中其他需要修正的问题
- 赋值操作误用了比较运算符:代码中
taken[a][i] == 1;和taken[a][i] == 2;是判断相等的比较操作,不会给taken数组赋值,要改成单等号=:taken[a][i] = 1;、taken[a][i] = 2; - erase操作的容器索引错误:
spaces[a].erase(spaces[i].begin() + i);中取迭代器误用了spaces[i],应该改为你要操作的spaces[a],否则当循环变量i和行列索引a不一致时会出现越界错误,修正为spaces[a].erase(spaces[a].begin() + i); - 建议给switch添加default分支,处理输入不是A/B/C的异常情况,避免变量
a未初始化导致的未定义行为。
内容的提问来源于stack exchange,提问作者SpickleMickleDev
相关产品推荐
相关产品推荐

