我的代码在不同的IDE上显示不同的结果。对于我的IDE上的输入1//2
,它会显示输入格式错误,但是在其他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;
}
main()代码:
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
答案 0 :(得分:6)
in >> d
失败,因为流中的字符无法解析为整数。 d
尚未初始化。 R(n, d)
然后对d
进行的任何操作都通过访问未初始化的对象而表现出未定义的行为。