正しい使い方はcin.fail();
?
何かを入力する必要があるプログラムを作成しています。数字または文字を入力する必要があるかどうかはあまり明確ではありません。ユーザーが数字の代わりに文字を入力すると、コンソールがおかしくなります。これを修正するにはどうすればよいcin.fail()
ですか?
それとももっと良い方法がありますか?
std::cin.fail()
前の入力が成功したかどうかをテストするために使用されます。ただし、ストリームをブール値であるかのように使用する方が慣用的です。
if ( std::cin ) {
// last input succeeded, i.e. !std::cin.fail()
}
if ( !std::cin ) {
// last input failed, i.e. std::cin.fail()
}
入力の構文が文字数を許可するコンテキストでは、通常の解決策は、行ごとに (または他の文字列形式で) 読み取り、解析することです。数値があることを検出したら、 を使用しstd::istringstream
てそれを変換するか、任意の数の他の代替手段 ( strtol
、または
std::stoi
C++11 を使用している場合) を使用できます。
ただし、ストリームから直接データを抽出することは可能です。
bool isNumeric;
std::string stringValue;
double numericValue;
if ( std::cin >> numericValue ) {
isNumeric = true;
} else {
isNumeric = false;
std::cin.clear();
if ( !(std::cin >> stringValue) ) {
// Shouldn't get here.
}
}
cin.fail()
最後の cin コマンドが失敗した場合は true を返し、それ以外の場合は false を返します。
例:
int main() {
int i, j = 0;
while (1) {
i++;
cin >> j;
if (cin.fail()) return 0;
cout << "Integer " << i << ": " << j << endl;
}
}
ここで、テキスト ファイル (input.txt) があり、その内容は次のとおりだとします。
30 40 50 60 70 -100 Fred 99 88 77 66
その上で上記のショート プログラムを実行すると、次のようになります。
Integer 1: 30
Integer 2: 40
Integer 3: 50
Integer 4: 60
Integer 5: 70
Integer 6: -100
7 番目の単語を読み取った後に終了するため、6 番目の値の後には続行されません。これは整数ではないためです: をcin.fail()
返しますtrue
。