1

これが私のコードです:

int main()
{
    int nothing;
    string name;
    int classnum;
    bool classchosen;
    string classname;

    cout << "Welcome adventurer, your journey is about to begin.\n\n";
    cout << "Firstly, what's your name? ";
    cin >> name;
    classchosen = false;
    while (classchosen == false)
    {
        cout << "\n\nNow, " << name << ", choose your class entering its number.\n\n";
        cout << "1- Warrior\n" << "2- Mage\n" << "3- Paladin\n" << "4- Monk\n\n";
        cout << "Class number: ";
        cin >> classnum;
        switch(classnum){
            case 1:
                    classname = "Warrior";
                    classchosen = true;
                    break;
            case 2:
                    classname = "Mage";
                    classchosen = true;
                    break;
            case 3:
                    classname = "Paladin";
                    classchosen = true;
                    break;
            case 4:
                    classname = "Monk";
                    classchosen = true;
                    break;
            default:
                    cout << "\nWrong choice, you have to enter a number between 1 and 4.\n" << endl;
                    break;
        }
    }
    cout << "\nSo you are a " << classname << " ? Well, tell me something more about you...\n";
    cin >> nothing;
    return 0;
}

今、それを実行して文字列 (たとえば "fjdfhdk") を入力してクラス番号を尋ねると、プログラムはデフォルトのステートメントに入る代わりに無限ループし、質問を書き直して別のクラスを選択させます。なんで?

4

2 に答える 2

1

Try something like this:

#include <sstream>
#include <string>
using namespace std;

int getInt(const int defaultValue = -1){
  std::string input;
  cin >> input;
  stringstream stream(input);
  int result = defaultValue;
  if(stream >> result) return result;
  else return defaultValue;

}

//..in main
cout << "Class number: ";
int classNum = getInt();
switch(classNum){ .... }

The reason why it fails in your case is because cin is trying to read a bunch of chars into a int variable. You can either read it as a string and convert as necessary, or you can check the cin state explicitly when reading into a int variable by checking if any of the fail bits are set. The fail bits would be set if for example you try to read bunch of chars into an int.

于 2013-05-22T18:06:52.407 に答える
1

intに読み込んでいて、読み取りが失敗するためです。これには 2 つの効果があります。

  1. その後の使用classnumは未定義の動作であり、
  2. ストリームはエラー状態を記憶しているので、後で確認できます。

エラー状態が解消されない限り、ストリームに対する以降の操作はすべて no-op です。これを機能させるためのプログラムの最も簡単な変更は次のとおりです。

std::cin >> classnum;
if ( !std::cin ) {
    classnum = 0;
    std::cin.clear();
    std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
}
switch ( classnum ) // ...

エラーの場合、これはclassnum既知の値に設定され、エラー状態をクリアし、次の改行まですべての入力をスキップします。(そうしないと、エラーを引き起こした文字がまだ存在するため、再び失敗するだけです。)

ただし、別の関数を使用して int を抽出し、getlineuser814628 の提案に従って を使用することを検討してください。上記は、何が起こっているのか、なぜ症状が見られるのかを説明するためのものです。user814628 の提案は、はるかに優れたソフトウェア エンジニアリングです。

于 2013-05-22T18:21:41.220 に答える