Итак, я работаю над назначением класса, где мне нужно взять двоичное число с основанием 2 и преобразовать его в его эквивалент с основанием 10. Я хотел сохранить двоичный файл в виде строки, затем просканировать строку и пропустить нули, а на единицу добавить 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");
}
1
PrometheusAurelius 18 Сен 2021 в 04:13

3 ответа

Лучший ответ

Индексы массивов для C ++ и многих других языков используют индекс, отсчитываемый от нуля. Это означает, что для массива размером 5 диапазон индекса составляет от 0 до 4. В вашем коде выполняется итерация от 1 до array_length. Использовать: for (int i = 0; i < binaryNumber.length(); i++)

2
Nevus 18 Сен 2021 в 01:31

Потому что вы начали с 1, а не с 0

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

Попробуй с этим

for (int i = 0; i < binaryNumber.length(); i++)
0
Degik 18 Сен 2021 в 01:33

Проблема не в операторе if, а в условии цикла и индексе.

Ваш индекс начинается с единицы, а первый символ строки будет с нулевым индексом. Ошибка вашего диапазона памяти вызвана тем фактом, что цикл останавливается, когда он меньше или равен, в результате чего индекс увеличивается на единицу слишком много и выходит из диапазона памяти строки.

Просто изменив цикл с

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;
    }
}

Решим вопрос.

0
Stripes 18 Сен 2021 в 01:37