C ++错误:第1440行表达式:字符串下标超出范围

时间:2013-09-19 01:50:10

标签: c++ arrays

程序构建并运行,但输入第一个整​​数后按Enter键,然后出现错误弹出框,然后按忽略并输入第二个整数并按Enter键弹出框出现,按下忽略后返回正确答案。我的智慧结束了,这可以帮助我解决弹出框的问题。

#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");
}

1 个答案:

答案 0 :(得分:0)

看起来你正在成为C风格字符串和C ++字符串之间差异的牺牲品。 C风格的字符串是一系列char s后跟零(或空)字节。 C ++字符串是包含一系列字符的对象(通常是char,但最终这将是一个你应该打破的假设)并且知道它们自己的长度。 C ++字符串本身可以包含空字节而没有问题。

要遍历C ++风格字符串的所有字符,您可以执行以下操作之一:

  • 您可以使用.size()变量的.length()string成员来查找其中的字符数,例如for (int i=0; i<str.size(); i++) { char c = str[i];
  • 您可以使用.begin().end()分别获取字符串开头和结尾的迭代器。 for (std::string::iterator it=str.begin(); it!=str.end(); ++it)形式的for循环将通过访问*it来遍历字符串成员。
  • 如果您正在使用C ++ 11,则可以使用for循环结构,如下所示:for (auto c: str)其中c将是字符串str的字符类型

将来,为了解决这些问题,您可以尝试使用调试器来查看程序崩溃或遇到异常时会发生什么。您可能会发现largeintegers::Input()内部遇到了内存访问冲突或其他问题。

最后,作为一个面向未来的批评,你不应该使用C风格的数组(你说int integer[ numbers ];)而不是使用C ++风格的容器,例如vectorvector是一系列可以根据需要展开的对象(例如int)。