将索引 i 处的字符串与 C++ 中的值进行比较

comparing a string at index i to a value in C++

所以我正在处理一个 class 作业,我需要将一个以 2 为底的二进制数转换为以 10 为底的等效二进制数。我想将二进制文件存储为一个字符串,然后扫描该字符串并跳过 0,并在 1 处添加 2^i。我无法将索引 i 处的字符串与 '0 进行比较,并且我不确定为什么 if(binaryNumber.at(i) == '0') 不起作用。它会导致“超出范围内存错误”。谁能帮我理解为什么这不起作用?

#include <iostream>
using namespace std;

void main() {
    string binaryNumber;
    int adder;
    int total = 0;

    cout << "Enter a binary number to convert to decimal \n";
    cin >> binaryNumber;
    reverse(binaryNumber.begin(),binaryNumber.end());

    for (int i = 1; i <= binaryNumber.length(); i++) {
        if(binaryNumber.at(i) == '0') { //THIS IS THE PROBLEM
        //do nothing and skip to next number
        }
        else {
            adder = pow(2, i);
            total = adder + total;
        }
    }

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

C++ 和许多其他语言的数组索引使用从零开始的索引。这意味着对于大小为 5 的数组,索引范围从 0 到 4。在您的代码中,您从 1 迭代到 array_length。采用: for (int i = 0; i < binaryNumber.length(); i++)

因为你是从 1 而不是 0 开始的

for (int i = 1; i <= binaryNumber.length(); i++)

尝试一下

for (int i = 0; i < binaryNumber.length(); i++)

问题不在于 if 语句,而在于循环条件和索引。

您的索引从 1 开始,而字符串的第一个字符将在索引 0 处。你的out memory range错误是由于循环在小于或等于时停止,导致索引增加了太多而离开了字符串的内存范围。

只需将循环从

更改为
for (int i = 1; i <= binaryNumber.length(); i++) {
    if(binaryNumber.at(i) == '0') {
    }
    else {
        adder = pow(2, i);
        total = adder + total;
    }
}

for (int i = 0; i < binaryNumber.length(); i++) {
    if(binaryNumber.at(i) == '0') { 
    }
    else {
        adder = pow(2, i);
        total = adder + total;
    }
}

将解决问题。