12

ここにコードがあります

double enter_number()
{
  double number;
  while(1)
  {

        cin>>number;
        if(cin.fail())
        {
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
            cout << "Invalid input " << endl;
        }
        else
        break;
        cout<<"Try again"<<endl;
  }
  return number;
}

私の問題は、1x のようなものを入力すると、別の実行のために除外された文字に気付かずに 1 が入力として取得されることです。1.8 などの実数で動作させる方法はありますか?

4

3 に答える 3

31

cinが指定された変数に適切に読み込めない入力(整数変数への文字の入力など)を検出すると、エラー状態になり、入力をバッファーに残します。

このシナリオを適切に処理するには、いくつかのことを行う必要があります。

  1. このエラー状態をテストする必要があります。
  2. エラー状態をクリアする必要があります。
  3. または、エラー状態を生成した入力データを処理するか、それをフラッシュしてユーザーに再プロンプトを表示する必要があります。

次のコードは、これら3つのことを行うための多数の方法の1つを提供します。

#include<iostream>
#include<limits>
using namespace std;
int main()
{

    cout << "Enter an int: ";
    int x = 0;
    while(!(cin >> x)){
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "Invalid input.  Try again: ";
    }
    cout << "You enterd: " << x << endl;        
}

1000のようにcin.ignoreに大きな値を渡すだけで、すべての実用的な目的でまったく同じように動作する可能性があります。

入力の試行後にcinをテストし、if(!cin){//エラーをクリーンアップする}のように処理することもできます。

ストリーム状態を処理する他のメンバー関数については、istreamリファレンスを確認してください:http://cplusplus.com/reference/iostream/istream/

于 2012-05-31T07:15:14.273 に答える
14

std::getlineandを使用しstd::stringて行全体を読み取り、行全体を double に変換できる場合にのみループから抜け出します。

#include <string>
#include <sstream>

int main()
{
    std::string line;
    double d;
    while (std::getline(std::cin, line))
    {
        std::stringstream ss(line);
        if (ss >> d)
        {
            if (ss.eof())
            {   // Success
                break;
            }
        }
        std::cout << "Error!" << std::endl;
    }
    std::cout << "Finally: " << d << std::endl;
}
于 2012-05-31T07:21:55.200 に答える