0

非常に単純な入力検証アルゴリズムを作成しました。なかなか良かったと思いましたが、テストしてみるとわからないことがありました。これが最初のコードです。

#include <iostream>
#include <cstdlib>
#include <sstream>
#include <string>

using namespace std;

int main()
{
cout << "Simple Menu"
    << "\n\t\t1. Input"
    << "\n\t\t2. Exit" << endl;

string input = "";

int myNum = 0;

char myChar = {0};

do
{
    cout << "Please enter a valid menu option: ";
    getline(cin,input);

    if (!(stringstream(input) >> myNum))
    {
        cout << "Please enter a valid menu option: ";
        getline(cin,input);
    }           

}while(myNum < 1 || myNum > 5 || input.length() != 1);

cout << "\nThe menu option you entered is: " << myNum << endl << endl;

return 0;       
}

結局、.1を選択肢として入れると、有効なオプションを入力するように求められます。これは良いことです。ただし、.1を入力した直後に2(有効なオプション)を入力すると、不正な値を入力したかのように反応します。このようなイベントのコンソールウィンドウは次のとおりです。

Simple Menu
                1. Input
                2. Exit
Please enter a valid menu option: .1
Please enter a valid menu option: 2
Please enter a valid menu option: 2

The menu option you entered is: 2

Press any key to continue . . .

これがなぜなのか、何か考えはありますか?

4

2 に答える 2

3

現在のコード:

do
{
    cout << "Please enter a valid menu option: ";    // first prompt
    getline(cin,input);                              // you enter .1

    if (!(stringstream(input) >> myNum))
    {
        cout << "Please enter a valid menu option: ";// second prompt
        getline(cin,input);                          // this data is discarded
    }           

}while(myNum < 1 || myNum > 5 || input.length() != 1);

への変更:

do
{
    cout << "Please enter a valid menu option: "; // first prompt
    getline(cin,input);                           // .1

    if (!(stringstream(input) >> myNum)) continue;// if parsing fails loop back
} while(myNum < 1 || myNum > 5 || input.length() != 1);

さらに簡略化して:

myNum = -1;
do
{
    cout << "Please enter a valid menu option: "; // first prompt
    getline(cin,input);                           // .1

    stringstream(input) >> myNum;
} while(myNum < 1 || myNum > 5);
于 2012-11-10T04:19:55.557 に答える
1

あなたの論理をたどってください、それはあなたがそれをするように言ったことをします。あなたが欲しいのはそういうものです

string input;
int myNum = -1;
while(myNum < 1 || myNum > 5 || input.length != 1){
    cout << "Please pick a valid menu options: ";
    getline(cin,input);
    stringstream parser(input);
    if(! (parser >> input )){
       input.clear();
       myNum = -1;
    }  
}
于 2012-11-10T04:26:09.187 に答える