0

我有一个我一直在做的个人项目。为了工作,它需要(相对)从用户那里接受大量数据,以 12 个用户的四种不同数据的形式。因此,我有相当长的一系列类似这样的语句:

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;

等等

然而,有时可能只需要输入少于 12 个怪物的数据,例如 5-6 甚至 1-2。我希望能够使用命令将输入​​部分跳过到基于击键之类的代码的其余部分。即如果用户输入了 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 缓冲区?并尝试清除标准输入缓冲区。

[编辑] 我修复了循环中的错误

于 2013-06-17T13:06:31.307 回答
0

我刚刚测试了这组代码,它似乎可以按照您的意愿工作。当然,您必须对其进行修改以适合您的原始应用程序。

std::string in;

while (true) {
    std::cout << "Enter a name\n";
    std::cin >> in;
    if (in == "#")
        break;
    std::cout << "\nMonster A's name is: " << in << "\n";
}

为了合并怪物数量的限制,而不是将true参数传递到 while 循环中,只需添加一个计数器来计算创建的怪物数量并在该条件下中断:

int num_monsters = 0;
while (num_monsters <= 12) {
    ...
    num_monsters++;
}

希望这可以帮助。

于 2013-06-17T15:08:29.760 回答
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 回答
0

我认为这是可以通过使用哨兵怪物名称来解决的问题,如下所示。

const string SentinelName = "%^&";
while(true)
{
    cout << '\n' << "Monster A's name is(if u want to end, pls input %^&): ";
    cin >> nameA;
    if(strcmp(nameA, SentinelName.s_str())
        break;
    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;
}

希望这可以解决你的问题。另外,给你的代码一点建议,你可以把怪物的属性,比如名字,模式级别等封装到一个类中,这样你的代码看起来更漂亮。

于 2013-06-23T01:45:22.077 回答