Ошибка С++: строка 1440 Выражение: строковый индекс вне диапазона

Программа строит и запускает, однако после ввода первого целого числа и нажатия ввода появляется всплывающее окно с ошибкой, затем после нажатия игнорирования и ввода второго целого числа и нажатия клавиши ввода появляется всплывающее окно и после нажатия игнорируется, он возвращает правильный ответ. Я нахожусь наедине с этим, может кто-нибудь помочь мне исправить всплывающее окно.

#include "stdafx.h"
#include <iostream>
#include <cctype>
#include <string>
using namespace std;
#define numbers 100

class largeintegers {
public:
 largeintegers();
 void
 Input();
 void
 Output();
 largeintegers
 operator+(largeintegers);
 largeintegers
 operator-(largeintegers);
 largeintegers
 operator*(largeintegers);
 int
 operator==(largeintegers);
private:
 int integer[numbers];
 int len;
};

void largeintegers::Output() {
 int i;
 for (i = len - 1; i >= 0; i--)
 cout << integer[i];
}

void largeintegers::Input() {
 string in;
 int i, j, k;
 cout << "Enter any number:";
 cin >> in;
 for (i = 0; in[i] != '\0'; i++)
 ;
 len = i;
 k = 0;
 for (j = i - 1; j >= 0; j--)
 integer[j] = in[k++] - 48;
}

largeintegers::largeintegers() {
 for (int i = 0; i < numbers; i++)
 integer[i] = 0;
 len = numbers - 1;
}

int largeintegers::operator==(largeintegers op2) {
 int i;
 if (len < op2.len) return -1;
 if (op2.len < len) return 1;
 for (i = len - 1; i >= 0; i--)
 if (integer[i] < op2.integer[i])
 return -1;
 else if (op2.integer[i] < integer[i]) return 1;
 return 0;
}

largeintegers largeintegers::operator+(largeintegers op2) {
 largeintegers temp;
 int carry = 0;
 int c, i;
 if (len > op2.len)
 c = len;
 else
 c = op2.len;

 for (i = 0; i < c; i++) {
 temp.integer[i] = integer[i] + op2.integer[i] + carry;
 if (temp.integer[i] > 9) {
 temp.integer[i] %= 10;
 carry = 1;
 } else
 carry = 0;
 }
 if (carry == 1) {
 temp.len = c + 1;
 if (temp.len >= numbers)
 cout << "***OVERFLOW*****\n";
 else
 temp.integer[i] = carry;

 } else
 temp.len = c;
 return temp;
}
largeintegers largeintegers::operator-(largeintegers op2) {
 largeintegers temp;
 int c;
 if (len > op2.len)
 c = len;
 else
 c = op2.len;
 int borrow = 0;
 for (int i = c; i >= 0; i--)
 if (borrow == 0) {
 if (integer[i] >= op2.integer[i])
 temp.integer[i] = integer[i] - op2.integer[i];
 else {
 borrow = 1;
 temp.integer[i] = integer[i] + 10 - op2.integer[i];
 }
 } else {
 borrow = 0;
 if (integer[i] - 1 >= op2.integer[i])
 temp.integer[i] = integer[i] - 1 - op2.integer[i];
 else {
 borrow = 1;
 temp.integer[i] = integer[i] - 1 + 10 - op2.integer[i];
 }
 }
 temp.len = c;
 return temp;
}
largeintegers largeintegers::operator*(largeintegers op2) {
 largeintegers temp;
 int i, j, k, tmp, m = 0;
 for (i = 0; i < op2.len; i++) {
 k = i;
 for (j = 0; j < len; j++) {
 tmp = integer[j] * op2.integer[i];
 temp.integer[k] = temp.integer[k] + tmp;
 temp.integer[k + 1] = temp.integer[k + 1] + temp.integer[k] / 10;
 temp.integer[k] %= 10;
 k++;
 if (k > m) m = k;
 }
 }
 temp.len = m;
 if (temp.len > numbers) cout << "***OVERFLOW*****\n";
 return temp;
}

using namespace std;
int main() {
 int c;
 largeintegers num1, num2, result;
 num1.Input();
 num2.Input();
 num1.Output();
 cout << " + ";
 num2.Output();
 result = num1 + num2;
 cout << " = ";
 result.Output();
 cout << "\n\n";
 num1.Output();
 cout << " - ";
 num2.Output();
 result = num1 - num2;
 cout << " = ";
 result.Output();
 cout << "\n\n";
 num1.Output();
 cout << " * ";
 num2.Output();
 result = num1 * num2;
 cout << " = ";
 result.Output();
 cout << "\n\n";
 c = num1 == num2;
 num1.Output();
 switch (c) {
 case -1:
 cout << " is less than ";
 break;
 case 0:
 cout << " is equal to ";
 break;
 case 1:
 cout << " is greater than ";
 break;
 }
 num2.Output();
 cout << "\n\n";
 system("pause");
}
</string></cctype></iostream>
1 ответ

Кажется, вы становитесь жертвой разницы между строками C-стиля и строками C++. Строки в стиле C представляют собой серию char за которыми следует нулевой (или нулевой) байт. Строки C++ - это объекты, содержащие ряд символов (обычно char, но в конечном итоге это будет предположение, которое вы должны сломать), и которые знают свою собственную длину. Строки C++ могут содержать нулевые байты посредине без проблем.

Чтобы перебрать все символы строки C++, вы можете сделать одно из нескольких вещей:

  • Вы можете использовать .size() или .length() string переменной, чтобы найти количество символов в ней, например in for (int i=0; i
  • <li> Вы можете использовать <code>.begin() и .end() чтобы получить итераторы в начало и конец строки, соответственно. Цикл for в форме for (std::string::iterator it=str.begin(); it!=str.end(); ++it) проведет вас через члены строки, for (std::string::iterator it=str.begin(); it!=str.end(); ++it) к *it.
  • Если вы используете C++ 11, вы можете использовать конструкцию for loop следующим образом: for (auto c: str) где c будет типа символа строки str.
<p> В будущем для решения таких проблем вы можете попробовать использовать отладчик, чтобы узнать, что произойдет, когда ваша программа выйдет из строя или ударит исключение. Вероятно, вы обнаружите, что внутри <code>largeintegers::Input() вы largeintegers::Input() либо с нарушением доступа к памяти, либо с какой-то другой проблемой.

Наконец, в качестве будущей критики вам не следует использовать массивы C-стиля (где вы указываете int integer[ numbers ];) в пользу использования контейнеров стиля C++, таких как vector. vector представляет собой ряд объектов (таких как int s), которые могут расширяться по мере необходимости.

licensed under cc by-sa 3.0 with attribution.