Почему оператор >> показывает разные результаты на разных компиляторах? - PullRequest
2 голосов
/ 13 июня 2019

Мой код показывает разные результаты на разных IDE.Для ввода 1//2 в моей IDE он показывает ошибку формата ввода, но в другой IDE он выдает DivisionByZero.

Я пробовал включить in.peek() == '/' , даже если это не имеет смысла, но безрезультатно.

struct DivisionByZero : public exception {
    const char * what() const throw() {
        return "Zero Denominator";
    }
};

Конструктор для оператора R

R::R(int n, int d)
{
    if (d==0)
    {
        throw DivisionByZero();
    }
    n_ = n * (d / abs(d));
    d_ = abs(d);
}

>>

std::istream &operator>>(std::istream &in, R &r){
    int n, d;
    in >> n;

    if (in.peek() == '/')
    {
        in.ignore();
        if ( (in.peek() < '0' || in.peek() > '9') ){
            in.setstate(ios_base::failbit);
        }
        in >> d;
        r = R(n, d);
    }
    return in;
}

основной () код :

R n1, n2;
char op;
try
{
while (cin >> n1 >> op >> n2) {
    switch (op) {
        case '+':
            cout << n1 + n2 << endl;
            break;
        case '-':
            cout << n1 - n2 << endl;
            break;
        case '*':
            cout << n1 * n2 << endl;
            break;
        case '/':
            cout << n1 / n2 << endl;
            break;
        }
    }
}
catch(DivisionByZero& e){
    cerr << e.what();
    return 1;
}
if (cin.fail())
{
    cin.clear();
    cerr << "Input format error before '" << char(cin.peek()) <<"'";
    return 2;
}
return 0;

Ожидаемый результат : Input format error before '/'

Фактический выход : Zero Denominator

1 Ответ

6 голосов
/ 13 июня 2019

in >> d терпит неудачу, так как символы в потоке не могут быть проанализированы как целое число.d остается неинициализированным.Все, что R(n, d) делает с d, проявляет неопределенное поведение, обращаясь к неинициализированному объекту.

...