0

入力が整数でない場合は、ユーザー入力を取得してプログラムを終了したいと思います。本からプログラムをチェックしました: http://homepages.gac.edu/~mc38/2013J/code/bookCode/ch03/elevator2.cpp

Iを使用すると、これを確認できると書かれていcin.fail()ます。しかし、床タイプの値を入力してもプログラムが終了しません。たとえば、2.5 を入力すると、エラー メッセージ「整数ではありません」ではなく、出力が 2 になります。

4

1 に答える 1

0

ここでの問題は、文字列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::failbitstd::ios_base::badbit設定されている) だった場合や、ファイルの終わりに達した場合に返されます。この操作の直前にストリームは OK だったので、考えられる唯一の失敗はファイルの終わりに達したことです。次に、どの文字が検出されたかを検討し、それを受け入れるかどうかを決定できます。この例では、スペースと','実行可能なセパレーターとして。次の文字はまだ抽出されていないことに注意してください。つまり、たとえばstd::cin.ignore().

于 2013-11-10T15:26:55.203 に答える