3

整数入力を受け取り、cin ストリームの状態を出力する次のコードを考えてみましょう。

#include <iostream>  
using namespace std;

int main()
{
    int number;
    cout<<"Enter a number \n";
    cin>>number;
    cout<<cin.rdstate()<<endl;
    return 0;
}

入力された数値が「zzzz」の場合、rdstate は値 4 を返します。
入力された数値が「10zzzz」の場合、rdstate は値 0 を返します。数値の値は 10 で、入力ストリームの値は「zzzz」です。それ。

私の質問は次のとおり
です。1.「10zzzz」の入力が無効な入力として扱われないのはなぜですか (少なくとも 1 つの障害ビットが設定されている必要があります)
。 2.この状況を検出して処理するためのエレガントなソリューションは何ですか。

ありがとう!!!

4

1 に答える 1

1

まず最初に、あなたが何をしようとしているのかをお聞きしたいと思います:

cout<<cin.rdstate()<<endl;

rdstate() の適切な使用については、このページをお読み ください http://www.cplusplus.com/reference/iostream/ios/rdstate/

2 番目: 入力が文字列型か整数型かをチェックするには、入力文字列を整数データに変換し、無効な入力が与えられたときにエラー メッセージを返します。

したがって、これはあなたを助けるでしょう:

int main() {

 string input = "";

 // How to get a string/sentence with spaces
 cout << "Please enter a valid sentence (with spaces):\n>";
 getline(cin, input);
 cout << "You entered: " << input << endl << endl;

 // How to get a number.
 int myNumber = 0;

 while (true) {
   cout << "Please enter a valid number: ";
   getline(cin, input);

   // This code converts from string to number safely.
   stringstream myStream(input);
   if (myStream >> myNumber)
     break;
   cout << "Invalid number, please try again" << endl;
 }
 cout << "You entered: " << myNumber << endl << endl;

 // How to get a single char.
 char myChar  = {0};

 while (true) {
   cout << "Please enter 1 char: ";
   getline(cin, input);

   if (input.length() == 1) {
     myChar = input[0];
     break;
   }

   cout << "Invalid character, please try again" << endl;
 }
 cout << "You entered: " << myChar << endl << endl;

 cout << "All done. And without using the >> operator" << endl;

 return 0;
}
于 2012-05-09T09:18:21.307 に答える