C++二进制转十进制时对比string索引i处字符出现越界错误如何解决
错误产生原因
- C++中
std::string的索引从0开始计数,有效索引范围为0 ~ 字符串长度-1。你的for循环设置为i <= binaryNumber.length(),当i等于字符串长度时,binaryNumber.at(i)访问了超出合法范围的内存,at方法检测到越界后直接抛出异常,这是报错的直接原因。 - 同时你的逻辑存在三处隐含错误:
- 循环从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
相关产品推荐
相关产品推荐

