0

個人的に取り組んでいるプロジェクトがあります。機能するには、12 人のユーザーに対して 4 種類のデータの形式で、ユーザーから (比較的) 大量のデータを受け取る必要があります。そのため、次のような非常に長い一連のステートメントがあります。

cout << '\n' << "Monster A's name is: ";
cin >> nameA;
cout << '\n' << "Monster A rolled: ";
cin >> rollM_A;
cout << '\n' << "Monster A's Dex is: ";
cin >> DexA;
cout << '\n' << "Monster A's Mod is: ";
cin >> ModA;
cout << '\n' << "Monster A's Level is: ";
cin >> LvlA;

ただし、場合によっては、たとえば 5 ~ 6 または 1 ~ 2 など、12 体未満のモンスターのデータのみを入力する必要がある場合もあります。コマンドを使用して、キーストロークなどに基づいて入力セクションを残りのコードにスキップできるようにしたいと考えています。つまり、ユーザーが 5 匹のモンスターのデータを入力し、それで十分な場合は、バックスラッシュを押して残りの入力シーケンスをスキップできます。

私が話していることは意味がありますか/私が探していることを行うためのSTLコマンドはありますか? 現在、このプロセスはループされていませんが、ループ内にあると終了しやすくなりますか? 私はこのようなことをしようと考えていました:

while(cin.get() != '\') {
   cout << '\n' << "Monster A's name is: ";
   cin >> nameA;
   //etc...
}

編集:上記の試みは構築されますが、目的のキーストロークを入力すると、データを受け入れずにユーザープロンプトをすばやく無限に出力します。何かアドバイス?私が望むのは、それが壊れて先に進むことだけです。switch ステートメントを効果的に使用できますか?

ありがとう!

4

5 に答える 5

2

それはうまくいくかもしれません。'\' よりも一般的な EOF を使用することもできます。完了したら、Ctrl-D を押して EOF を送信すれば完了です。これにより、一部のプレイヤーがモンスターの名前として「\」を入力した場合の状況が処理されます。

于 2013-06-14T23:59:44.863 に答える
0

名前が\であるかどうかを確認できます。ユーザーフレンドリーではありませんが、機能します。

string name;
while (name != "\\") {
    cout << '\n' << "Monster A's name is: ";
    cin >> name;
    cout << "Received " << name << '\n';
    if (name != "\\") {
        // do something with name ...
    }
}

ループがまだエンドレスにループする場合は、cin バッファーをフラッシュするにはどうすればよいですか? を参照してください。stdinバッファをクリアしてみてください。

[編集] ループのエラーを修正しました

于 2013-06-17T13:06:31.307 に答える
0

ここに私が書いたものがあります。

struct Monster {
string name;
bool roll;
float dex;
float mod;
float level;
Monster(void) :
  name(),
  roll(false),
  dex(0),
  mod(0),
  level(0) { }
};


bool getMonsterInformationFromStdin(int index, Monster& monster) {
  string end_char = "\\";
  string name, roll, dex, mod, level;
  cout << '\n' << "Monster " << index << "'s name is: ";
  cin >> name;
  if (name.compare(end_char) == 0) return false;
  monster.name = name;
  cout << '\n' << "Monster " << index << " rolled: ";
  cin >> roll;
  if (roll.compare(end_char) == 0) return false;
  monster.roll = (roll[0] == 'y' || roll[0] == 'Y') ? true : false;
  cout << '\n' << "Monster " << index << "'s Dex is: ";
  cin >> dex;
  if (dex.compare(end_char) == 0) return false;
  monster.dex = atof(dex.c_str());
  cout << '\n' << "Monster " << index << "'s Mod is: ";
  cin >> mod;
  if (mod.compare(end_char) == 0) return false;
  monster.mod = atof(mod.c_str());
  cout << '\n' << "Monster " << index << "'s Level is: ";
  cin >> level;
  if (level.compare(end_char) == 0) return false;
  monster.level = atof(level.c_str());
  return true;
}


int main(int argc, char** argv) {
  int max_monsters = 10;
  for (int i = 0; i < max_monsters; i++) {
    Monster m;
    if( !getMonsterInformationFromStdin(i, m) ) break;
    string roll = m.roll ? "rolled" : "didn't roll";
    cout << m.name << " " << roll << " dex: " << m.dex << " mod: " << m.mod << " level: " << m.level << endl;
  }
  return 0;
}
于 2013-06-20T02:05:24.723 に答える