-3

该程序构建并运行,但是在输入第一个整​​数并按 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");
}
4

1 回答 1

0

看来您正在成为 C 样式字符串和 C++ 字符串之间差异的受害者。C 风格的字符串是一系列chars 后跟一个零(或空)字节。C++ 字符串是包含一系列字符(通常是 char,但最终这将是您应该打破的假设)并且知道它们自己的长度的对象。C++ 字符串可以在其自身中间包含空字节,而不会出现问题。

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

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

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

最后,作为面向未来的批评,您不应该使用 C 样式的数组(您所说int integer[ numbers ];的)来支持使用 C++ 样式的容器,例如vector. A是一系列可以根据需要扩展vector的对象(例如s)。int

于 2013-09-19T02:08:39.750 回答