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

C++二进制转十进制时对比string索引i处字符出现越界错误如何解决

错误产生原因
  1. C++中std::string的索引从0开始计数,有效索引范围为0 ~ 字符串长度-1。你的for循环设置为i <= binaryNumber.length(),当i等于字符串长度时,binaryNumber.at(i)访问了超出合法范围的内存,at方法检测到越界后直接抛出异常,这是报错的直接原因。
  2. 同时你的逻辑存在三处隐含错误:
    • 循环从i=1开始遍历,会直接跳过反转后字符串的第一个字符,也就是原二进制数的最低位,导致计算结果错误
    • 你在转换前已经反转了输入的二进制字符串,最终输出时直接打印反转后的字符串,和用户输入的原始内容不符
    • pow是浮点数运算函数,转int时可能出现精度误差,不适合用来计算整型的2次幂
修复方案

以下是修复后的完整代码:

#include <iostream>
#include <algorithm> // 新增头文件,reverse方法需要
#include <string>
using namespace std;

int main() { // 符合C++标准的main函数返回值
    string binaryNumber;
    int total = 0;

    cout << "Enter a binary number to convert to decimal \n";
    cin >> binaryNumber;
    string originalBinary = binaryNumber; // 保存原始输入字符串用于输出
    reverse(binaryNumber.begin(),binaryNumber.end());

    // 调整循环索引范围
    for (int i = 0; i < binaryNumber.length(); i++) {
        if(binaryNumber.at(i) == '1') { // 不需要判断0的情况,直接判断1累加即可
            total += 1 << i; // 用位运算计算2的i次幂,避免浮点数误差
        }
    }

    cout << "The binary number " << originalBinary << " is " << total << " in decimal form.\n";
    system("pause");
    return 0;
}

核心修改点:

  • 调整循环起始值为i=0,循环条件改为i < binaryNumber.length(),彻底解决越界问题
  • 新增变量保存原始输入的二进制字符串,保证输出内容和用户输入一致
  • 用位运算1 << i替代pow(2,i)计算2的次幂,避免浮点数精度问题
  • 补充了algorithm、string头文件,保证代码可跨编译器正常编译
  • 将void main改为符合C++标准的int main

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:27:02