残念ながら、あなたは本当にあなたが使用しているコードではなく、いくつかの擬似コードを示しませんでした。したがって、あなたが実際にやろうとしていることを伝えるのは難しいです。しかし、あなたの問題の説明と擬似コードから、問題の根源はあなたの入力をチェックせず、ストリームを合理的に良い状態に戻さないということです。メニュー選択を読むには、おそらくこれに似たコードを使用したい:
int choice(0);
if (std::cin >> choice) {
deal with the choice of the menu here
}
else if (std::cin.eof()) {
// we failed because there is no further input: bail out!
return;
}
else {
std::string line;
std::cin.clear();
if (std::getline(std::cin, line)) {
std::cout << "the line '" << line << "' couldn't be procssed (ignored)\n";
}
else {
throw std::runtime_error("this place should never be reached! giving up");
}
}
これは、入力は基本的に次のようになりますどのようにちょうどラフなレイアウトです。関数にカプセル化されている可能性があります(その場合は、閉鎖された入力から幾分別の方法で取り除きたい、場合によっては例外または特別な戻り値を使用して)。彼の主な部分は
- にあり、この場合に
std::string
とstd::getline()
を使用して、不正な入力をスキップstd::isteam::clear()
- を使用して戻って良好な状態にストリームを復元します。
std::istream::ignore()
行の残りの部分
メニューには他の問題があるかもしれませんが、具体的なコードは見当たりませんが、具体的な問題が何であるかは分かりません。