すべての入力操作を確認する必要があります。
std::cout << "X: ";
if (!(std::cin >> x)) { /* error */ }
std::cout << "Y: ";
if (!(std::cin >> y)) { /* error */ }
エラーをどのように処理するかは、あなた次第です。早く戻ったり、ループから抜けたり、例外をスローしたりできます...すべて依存します。
解析可能なものが得られるまでループすることもできますが、ユーザーが入力ストリームを閉じると危険です。行ごとに読んで解析する方が良い:
std::cout << "Please enter an integer X: ";
int x;
bool success = false;
for (std::string line; std::getline(std::cin, line); )
{
std::istringstream iss(line);
if (iss >> x >> std::ws && iss.get() == EOF) // #1
{
success = true;
break;
}
std::cout << "Sorry, please try again: ";
}
if (!success)
{
std::cerr << "Unexpected end of input stream!\n";
std::exit(1);
}
このように、ユーザーがセッションの途中で [Ctrl]-D を押すと、プログラムはすぐにシャットダウンし、閉じられた入力ストリームからそれ以上値を読み取ろうとしません。
マークされた行の条件#1
は、整数の解析が成功したことと、行の終わりに到達したこと (中間の空白を飲み込むこと) の両方をテストします。