2017-03-04 7 views
0

ユーザーの入力が正しいかどうかをチェックするはずのC++コードを作成しました。最初に整数を入力し、その後に2文字を入力すると、端末スパムはy/nを数回試してみますか?私はそれが出力できる時間の量を制限しようとしましたが、何も働いていません。ユーザーの入力が正しくないかどうかを確認する関数

#include <iostream> 
#include <limits> 

using namespace std; 

int again() 
{ 

    char yorn = 'q'; 

    cout << "\n Would you like to run this program again? y/n: "; 
    cin >> yorn; 

    if (cin.fail()) { 

     int dof1 = 1; // dof1 stands for don't overflow 1 
     for (int i = 0; i < dof1; i++) { 
      cout << "ERROR -- You did not enter a valid symbol"; 
      // get rid of failure state 
      cin.clear(); 
      // discard 'bad' character(s) 
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      bool check = again(); 
      if (check == true) { 
       check = false; 
       return again(); 
      } 
      else 
       return 0; 
     } 
    } 
    switch (yorn) { 

    case 'y': 
     return true; 
     break; 

    case 'n': 
     return false; 
     break; 

    default: 
     return again(); 
     break; 
    } 
} 

int main() 
{ 

    int choice = 0; 
    cout << "\nWelcome to the Weight Tracker! Type 000 at any time to exit\n" 
     << "Choose the option you would like to use below \n" 
     << "1) \n" 
     << "2) \n" 
     << "3) \n" 
     << "Option selected: "; 
    cin >> choice; 
    if (cin.fail()) { 

     int dof2 = 1; // dof2 stands for don't overflow 2 
     for (int i = 0; i < dof2; i++) { 
      cout << "ERROR -- You did not enter an integer"; 
      // get rid of failure state 
      cin.clear(); 
      // discard 'bad' character(s) 
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      bool check = again(); 
      if (check == true) { 
       check = false; 
       return main(); 
      } 
      else 
       return 0; 
     } 
    } 
    switch (choice) { 

    case 1: 
     cout << " use later"; 
     break; 

    case 2: 
     cout << " use later"; 
     break; 

    case 3: 
     cout << " use later"; 
     break; 

    default: 
     cout << "ERROR -- Input invalid \n"; 
     bool check = again(); 
     if (check == true) { 
      check = false; 
      return main(); 
     } 
     else 
      return 0; 
     break; 
    } 

    return 0; 
} 
+0

メインを再帰的に呼び出しますか?あなたは本当にこのようにしたいですか?それは動作しますが、間違いなく良い練習ではありません。 – elanius

答えて

0

あなたは正直に言うと1 cin.ingnore

default: 
    cout << "ERROR -- Input invalid \n"; 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // ADD this line 
    bool check = again(); 

が欠落しています。このコードは混乱しています。再帰を削除してください。

+0

あなたはメインの再帰について話していますか? –

+0

あなたはmainとagainの両方の関数で再帰を持っています。マイフィックスを削除して "5dfh"と入力すると、再帰的に3回呼び出されます。数字の後には文字数が多い。デバッガを使用して、コールスタックをチェックしてください。 – elanius

関連する問題