std::istream & operator >>(std::istream & ins, Rational & target)
{
int num, den;
char symb;
std::cout << "Please enter a rational number: ";
ins >> num >> symb >> den;
std::cout << std::endl;
if(validateInput(num, symb, den)){
target = Rational(num, den);
return ins;
}
else{
std::cin >> target;
}
}
bool validateInput(int num, char symb, int den)
{
if(symb != '/'){
std::cout << "Error: Illegal format. Please use '2/4'." << std::endl;
return false;
}
if((static_cast<int>(num) != num) && (static_cast<int>(den) != den)){
std::cout << "Error: Not a valid rational number." << std::endl;
return false;
}
if(den == 0){
std::cout << "Error: Cannot divide by 0." << std::endl;
return false;
}
return true;
}
「x/y」の形式で有理数を取り込んでいるので、たとえば 2/4 です。正しく入力するとうまくいきます。2p4 と入力すると、正しいエラー (「/」が欠落している) が表示され、新しい番号を要求されます。分母に 0 が含まれている場合は、エラーが報告され、新しい数値が要求されます。
しかし、それが有効な番号かどうかを確認することはうまくいかないようです。「a/4」と入力すると、クラッシュするまで無限にループします。理由がわかりません。デバッガーを確認すると、ins >> ステートメントに戻りますが、ユーザーに何も要求しません。
私の論理がどこか間違っていると思います。注意してください、私はC ++にかなり慣れていないので、まだ学んでいます。以前に例外処理を試みていましたが、まだ適切に学習していなかったので、より慣れ親しんだものに落ち着きました。
ありがとう!