2016-11-23 8 views
1

をスキップしながら私は現在、この機能を持っている:ループはライン

double GrabNumber() { 
    double x; 
    cin >> x; 
    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "You can only type numbers!\nEnter the number: "; 
     cin >> x; 
    } 
    return x; 
} 

その目的はxはそれがない場合は、それが有効かcin >> xを繰り返すことであれば、それを返し、有効な数値であるかどうかを確認することです。

それは、この関数の間と呼ばれています:

void addition() { 
    cout << "\nEnter the first number: "; 
    double a = GrabNumber(); 
    cout << "Enter the second number: "; 
    double b = GrabNumber(); 
// rest of code 

私は、たとえば入力し、「6+」、それは最初の数字を入力するように私に語ったとき、それはそれを受け入れたが、すぐに二行目に行くと、それを呼び出します私が入力したこともないエラーです。

最初の入力は「6」しか受け付けないが、「+」はエラーを返す2番目の入力に行くからだと考えている。したがって、whileのパラメータに問題がある必要があります。

+1

あなたは['getline'](http:// www .complusplus.com/reference/string/string/getline /)と同様に 'cin'を使うのではなく、 – Garf365

+0

のように完全な行を解析しますが、Getlineは文字列として読み込みます –

答えて

4

入力がすぐに成功した場合、残りの行は無視されず、次の入力に終わります。これは単にcin.ignoreコールを複製することで修正できます。

double GrabNumber() { 
    double x; 
    cin >> x; 

    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // <-- 

    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "You can only type numbers!\nEnter the number: "; 
     cin >> x; 
    } 
    return x; 
} 

私は練習として、このコードを乾燥残しておきます;)

2

この種の問題を回避するために、getlinestodを使用して好む:一般的なケースでは

double GrabNumber() { 
    double x; 
    bool ok = false; 
    do 
    { 
     std::string raw; 
     std::getline (std::cin, raw); 
     try 
     { 
      x = stod(raw); 
      ok = true; 
     } 
     catch(...) 
     {} 
    } while(!ok); 
    return x; 
} 

を、それはに簡単ですgetlineで生の文字列を取得し、直後に解析します。このようにして、文字数、サインポジション、数字だけの場合はなど