3

整数入力を検証するために使用!(cin >> input)しますが、浮動小数点数などの他のデータ型をキャッチしません。代わりに、最初の整数を取ります。例えば:

数値を入力してください: 2.5.

私のエラーメッセージがここに表示されます。ループするはずですが、代わりに最初の番号が必要です。

「2」を出力

小数入力を無視するにはどうすればよいですか?

4

3 に答える 3

1

入力ストリームは、符号で始まり、その後に少なくとも 1 つの 10 進数が続くものを有効な整数入力と見なします。小数点を含む小数入力で失敗したい場合は、別のことをする必要があります。これを処理して整数を読み取り、整数の正常な読み取りに続く文字が小数点かどうかを確認する 1 つの方法:

if (!(std::cin >> value)
    || std::cin.peek() == std::char_traits<char>::to_int_type('.')) {
    deal_with_invalid_input(std::cin);
}

Thomas Matthews が正しく指摘したように、問題は実際には浮動小数点数に限定されているわけではなく、数字のプレフィックスの後にスペース以外が続くもの (EOF ではありません。上記のソリューションでは、実際にはファイル、つまり、何も続かない、改行さえも続かない)。整数の後にスペースが続くか、ファイルの末尾にあるものだけを読み取るには、次のようにします。

if (!(std:cin >> value)
    || (!std::isspace(std::cin.peek())
        && std::cin.peek() != std::char_traits<char>::eof())) {
    deal_with_invalid_input(std::cin);
}

既に読み取られた文字を返す方法は実際にはありません。これは多くの場所で使用するのはあまり良くないため、この関数を適切なstd::num_get<char>ファセットにパッケージ化しimbue()、ストリームを対応するstd::locale. これは少し高度ですが、コードを処理する式は実際にはより単純です。

于 2012-11-13T22:50:30.497 に答える
0

検証する前に、完全な入力を読み取る必要があります。cin.getline()orを使用してそれgetline()を行うことができ、入力が必要なものかどうかを確認します。

于 2012-11-13T22:50:03.697 に答える
0

cin を使用してさまざまなタイプの値を読み取ろうとしています。

istream>>入力から期待されるデータのタイプと一致するように演算子をオーバーロードし、クラスcinのインスタンスです。istream

予想される型が整数の場合、整数に変換できる文字列まで文字を消費し、残りの文字を後で解析するためにストリームに残します。float 値やその他の単純な型でも同じことが起こります。演算子とそれがすぐにサポートする型の詳細については、このリファレンス ページを参照してください。肝心なのは、整数値を取得したいが、入力から浮動小数点値を期待している場合は、入力から解析する正しい型の値 (ここでは浮動小数点) を使用し、後で必要な変換を行う必要があるということです (ここではtrunc、、、floorまたはceil必要に応じた丸め関数を使用します)。

簡単な例を次に示します。

#include <iostream>
#include <string>

using namespace std;

int main() {

    float f;
    string str;

    cout << "please enter a float :";
    cin >> f;

    cout << "value entered : " << f << endl;

    cout << "stream error : " 
         << (cin.fail() ? "yes" : "no") 
         << endl;

    cin >> str;

    cout << "remaining data : " << str << endl;

}

この非常に単純なプログラムは、>>istream での演算子の使用を示しています。具体的には、予想される float 値を使用しています。次の入力の場合: "1.2345Z6789" (数値の中央にあるZに注意してください)、プログラムは値 "1.2345" を解析し、入力バッファーに "Z6789" を残して、後続の読み取りに使用できるようにします。

ffromの型をfloattoに置き換えるintと、プログラムは同じ入力で値「1」を読み取り、入力バッファーに「.2345Z6789」が残ります。

注: コードでは、オペレーターを使用してストリームの状態をテストしています。これは、例で使用したメソッド!と同等です。fail

于 2012-11-13T23:36:03.433 に答える