2016-11-15 13 views
0

入力の検証を学習しましたが、問題が発生しました。私は、ユーザーが数字(スイッチのケースに含まれているもの)と文字列を入力すると、プログラムがクラッシュします。何が変更されるべきかについてのヒントは、検証がすべてに作用するのですか?番号を入力する場合数値と文字列での入力の検証

cin >> choice 

を使用して

int menu(double pi)                //menu for choosing a shape 
{ 
    int choice = 0; 
    cout << "Please select what you wish to calculate:\n\n1 - Area of a Circle\n\n2 - Circumference of a Circle\n\n3 - Area of a Rectangle\n\n4 - Area of a Triangle\n\n5 - Volume of a Cuboid\n\n "; 
    while (!(cin >> choice)) 
    { 
     cout << "Invalid input, please enter a number of 1-5\n\n"; 
     cin.clear(); 
     cin.ignore(100, '\n'); 
    } 
    system("CLS"); 

    switch (choice)                //switch case for each shape 
     { 
     case 1: 
      circleArea(pi); 
      break; 
     case 2: 
      circleCircum(pi); 
      break; 
     case 3: 
      rectanArea(); 
      break; 
     case 4: 
      triangArea(); 
      break; 
     case 5: 
      cubVol(); 
      break; 
     default: 
      cout << "Invalid input! Please try again.\n\n"; 
      break; 
     } 
    return 0; 
} 
+0

一般的には、防弾コードが必要な場合は、入力を文字列として読み取って解析し、必要なものに変換する必要があります。 – NathanOliver

+0

ええと、私はあなたが何を意味するのかは分かりませんが、それは問題ではない場合、いくつかのサンプルコードを提供してもよろしいですか?私はまだちょっとプログラミングの騒ぎで、9月に始まった。 – PinkieBarto

答えて

0

問題は>>は限りそれはとしてそれを扱いますそもそも数値入力があったとして、最初の非数値入力で停止となることです有効な読み取り。つまり、2L,2.0-1Tなどのすべての有効な整数入力は、cinまでです。無効な部分だけがストリームに残されます。この残りのスチーム入力は、次の入力操作でプログラムを混乱させます。

std::stringを入力してgetlineを使用して入力を読み取ってから、有効な入力が含まれていることを確認してください。あなたは、インスタンスのためにintを取得したい場合は

int choice; 
std::string input; 
std::size_t pos; 
do 
{ 
    std::cout << "Enter Choice: "; 
    std::getline(cin,input); 
    choice = stoi(input, &pos); 
} while(pos != input.size()); 

これは、あなたが押し上げるにすべてに読んinputに入ると、入力されたすべてのものが有効intに変換することができたら、あなただけのループを停止することをことを確認します。

+0

あなたが言っていることを理解しているが、これを私のプログラムに実装しようとしたが、getlineとstoiは未確認である。私が使用しなければならない追加ライブラリがありますか? (ちょうどを使用して) – PinkieBarto

+0

@PinkieBartoそれらのために ''が必要です – NathanOliver

関連する問題