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

C++十六进制转十进制求和程序中n1意外置0的原因及解决方法

问题排查:输入第二个十六进制数后n1被清零的原因与修复方案

兄弟,你遇到的这个问题其实是C++里非常常见的内存越界问题,咱们来一步步拆解:

核心成因:字符数组长度不足,导致内存被覆盖

你在类里定义的num1和num2是长度为2的字符数组:

char num1[2], num2[2];

但你要知道,C++里的字符串是靠**末尾的空字符\0**来标识结束的。当你用cin >> num1输入一个两位的十六进制数(比如F2)时,cin会把'F'和'2'存入数组,还会自动在最后加一个\0作为结束标记——但你的数组只有2个存储空间,这就导致\0被写到了数组之外的内存区域。

更巧(也更糟)的是,在编译器的内存布局里,你的类成员变量n1刚好就挨着num1和num2的内存块(这取决于编译器的内存对齐规则,但大概率是连续排布的)。当你输入num2时,同样的越界操作会把\0直接写到n1的内存位置上,把原本正确的数值直接冲成了0。

快速修复方案

只需要给字符数组多预留一个位置,用来存放结束符\0:

// 把数组长度从2改成3,给结束符留位置
char num1[3], num2[3];

额外优化建议(让代码更健壮)

为了避免以后再遇到类似问题,给你两个小建议:

  • 用std::string代替字符数组:完全不用手动管理内存,也不用担心越界问题,代码会更简洁。比如把类里的char num1[2], num2[2]改成std::string num1, num2,convert函数的参数也改成const std::string& num即可。
  • 在convert函数里增加输入合法性校验:判断输入的字符是否是有效的十六进制字符(0-9、A-F/a-f),避免非法输入导致的计算错误。

内容的提问来源于stack exchange,提问作者Jay Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:33:42