入力が整数でない場合は、ユーザー入力を取得してプログラムを終了したいと思います。本からプログラムをチェックしました: http://homepages.gac.edu/~mc38/2013J/code/bookCode/ch03/elevator2.cpp
Iを使用すると、これを確認できると書かれていcin.fail()
ます。しかし、床タイプの値を入力してもプログラムが終了しません。たとえば、2.5 を入力すると、エラー メッセージ「整数ではありません」ではなく、出力が 2 になります。
入力が整数でない場合は、ユーザー入力を取得してプログラムを終了したいと思います。本からプログラムをチェックしました: http://homepages.gac.edu/~mc38/2013J/code/bookCode/ch03/elevator2.cpp
Iを使用すると、これを確認できると書かれていcin.fail()
ます。しかし、床タイプの値を入力してもプログラムが終了しません。たとえば、2.5 を入力すると、エラー メッセージ「整数ではありません」ではなく、出力が 2 になります。
ここでの問題は、文字列2.5
が明らかに有効な整数、つまり . で始まっていることです2
。これは、ストリームが正常に読み取ったものです。したがって、読み取り後2
にストリームが失敗する理由はありません。
この状況に対処する 1 つの方法は、整数を読み取ることです。これが成功した場合は、読み取り操作を停止させた文字を調べます。この文字が適切な区切り記号 (スペース、ファイルの終わりなど) であるかどうか.、入力が成功したと見なします。
bool is_integer_separator(int value) {
return value == std::char_traits<char>::eof() // at the end of the file
|| value == ',' // accept comma as separator
|| std::isspace(static_cast<unsigned char>(value)); // ... and space
}
// ...
int value;
if (std::cin >> value && is_integer_separator(std::cin.peek())) {
...
}
else {
std::cout << "Not an integer\n";
}
一般に、整数を読み取り、整数に適合しない文字に遭遇したときに停止することは、成功の望ましい定義です。最もカスタマイズされた定義が必要な場合は、この機能を組み合わせて、ストリームで次に来るものを確認して構築できます。メンバーは次のstd::istream::peek()
文字を抽出せずに見ます。std::char_traits<char>::eof()
失敗した場合、たとえば、ストリームが失敗モード (つまり、持っているstd::ios_base::failbit
かstd::ios_base::badbit
設定されている) だった場合や、ファイルの終わりに達した場合に返されます。この操作の直前にストリームは OK だったので、考えられる唯一の失敗はファイルの終わりに達したことです。次に、どの文字が検出されたかを検討し、それを受け入れるかどうかを決定できます。この例では、スペースと','
実行可能なセパレーターとして。次の文字はまだ抽出されていないことに注意してください。つまり、たとえばstd::cin.ignore()
.