0
void get_english_input() {
    string input = " ";
    stringstream my_string(input);
    int ft;
    double in;

    while(true) {    
        cout << "Enter an integer value of feet." << endl;
        getline(cin, input);
        my_string << input;
        if(my_string >> ft)
            break;
        cout << "Invalid input! Please try again." << endl;
    }
    cout << "you entered " << ft << " as the int value for feet." << endl;
    /*while(true) {
        cout << "Enter a double value of inches." << endl;
        getline(cin, input);
        my_string << input;
            break;
    cout << "Invalid input! Please try again." << endl;
    }
    cout << "we are done entering english input" << endl;
    cout << "feet = " << ft << endl;
    cout << "inches = " << in << endl;*/
}

このコードは、my_string の内容を ft に入れようとすることで、入力が整数かどうかをテストすることになっています。整数の代わりに文字を入力すると、「無効な入力です!再試行してください」というエラー メッセージが表示されます。起こるはずです。問題は、そのメッセージを一度取得した後、次の入力が有効であっても、その後のすべての入力に対してメッセージを取得することです。


std::cin.clear();を使用する必要があると誰かが提案しました。エラーフラグをクリアします。getline() の前に置いてみましたが、問題は変わりませんでした。私はこれを間違って使用していましたか?

4

4 に答える 4

3

my_string のエラー状態をリセットできます。

my_string.clear();
my_string.ignore( /* big number of choice */ );

しかし、ここでは毎回再初期化する方が簡単だと思います:

while(true) {    
    cout << "Enter an integer value of feet." << endl;
    getline(cin, input);
    stringstream my_string(input);
于 2010-09-08T17:15:58.303 に答える
1

Boost の lexical_cast をチェックしてください...

于 2010-09-08T17:18:17.493 に答える
0

総当りの解決策は、入力を std::string にダンプし、次に文字列をループして、各文字が 0 から 9 の間にあるかどうかを確認することです。

これは最もエレガントなアプローチではありません。しかし、それは単純でばかげています。:-)

bool isnum(char c)
{
   if(! ( c <= '9' && c >= '0'))
   {  
       return false;
   }
   return true;
}


bool has_int(std::string &s)
{
   for( int i = 0; i < s.length(); i++)
   {
      if( ! isnum(s[i])
      {
         return false;
      }
   }

   return true;
}
于 2010-09-08T17:25:48.607 に答える
0

おもう

mystring >> ft

は常に true と評価されます (mystring が空の場合はそうではない可能性があります)。mystring に実際に数値が含まれているかどうかに関係なく、操作は機能します。

1つのアイデアは

 size_t found=input.find_first_not_of("0123456789 ");
  if (found!=string::npos)
  {
   cout <<   "Invalid input! Please try again."
  }

ここから適応

于 2010-09-08T17:28:23.600 に答える