整数入力を検証するために使用!(cin >> input)
しますが、浮動小数点数などの他のデータ型をキャッチしません。代わりに、最初の整数を取ります。例えば:
数値を入力してください: 2.5.
私のエラーメッセージがここに表示されます。ループするはずですが、代わりに最初の番号が必要です。
「2」を出力
小数入力を無視するにはどうすればよいですか?
整数入力を検証するために使用!(cin >> input)
しますが、浮動小数点数などの他のデータ型をキャッチしません。代わりに、最初の整数を取ります。例えば:
数値を入力してください: 2.5.
私のエラーメッセージがここに表示されます。ループするはずですが、代わりに最初の番号が必要です。
「2」を出力
小数入力を無視するにはどうすればよいですか?
入力ストリームは、符号で始まり、その後に少なくとも 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
. これは少し高度ですが、コードを処理する式は実際にはより単純です。
検証する前に、完全な入力を読み取る必要があります。cin.getline()
orを使用してそれgetline()
を行うことができ、入力が必要なものかどうかを確認します。
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" を残して、後続の読み取りに使用できるようにします。
f
fromの型をfloat
toに置き換えるint
と、プログラムは同じ入力で値「1」を読み取り、入力バッファーに「.2345Z6789」が残ります。
注: コードでは、オペレーターを使用してストリームの状態をテストしています。これは、例で使用したメソッド!
と同等です。fail