32ビット整数の最大値(2 ^ 31-1〜= 2.147b)がオーバーフローしています。これが発生cin
すると、フラグをクリアするまで正しく機能しません。エラーをチェックする必要がありますが、短期的な解決策は、番号を符号なしにするか、のように64ビットのものを使用することint64_t
です。cin
また、デフォルトでスキップされるため、スペースを無視する必要はありません。
有効な入力を確保するために、ここにあるようなものを実装できますが、特定の入力形式に合うように調整する必要があります。age
おそらく、フォーマットに関してそれぞれを入力するオーバーロードされた演算子を使用して3つを単一の型にカプセル化すると、構文がより適切に適合するため、例ではMixedNumber
オブジェクトに置き換えることができます。
私はこのようなものを用途の広い方法として見るでしょう:
template <typename T> //any type will work
void getValidInput (T &var, std::string prompt = "Input: ") {
while ((std::cout << prompt) && !(std::cin >> var)) { //if cin fails...
std::cin.clear(); //clear flag and discard bad input
std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "Invalid input; please re-enter.\n"; //let the user know
}
}
次に、次のようにプログラムを作成できます。
struct MixedNumber { //a data structure, so it's like using plain variables
int64_t whole;
int64_t numerator;
int64_t denominator;
};
std::istream &operator>> (std::istream &in, MixedNumber &num) { //so cin works
in >> num.whole >> num.numerator;
in.ignore(); //yes, you could enforce the format a bit more
in >> num.denominator;
return in;
}
int main() {
MixedNumber num; //easy to "make" a mixed number, a constructor works well too
getValidInput (num, "Input format: i<space>n/d: ");
std::cout << num.whole << '\n' << num.numerator << '\n' << num.denominator;
}