【问题标题】:Reprompt user after invalid input-c++输入无效后重新提示用户-c++
【发布时间】:2015-05-19 14:40:59
【问题描述】:

我修改了原始代码,前两个无效输入提示工作正常。当我在此提示中实现相同的逻辑以开始新游戏时,我的程序将无法识别无效输入,输入任何键都会开始新游戏。

void newGame()
{
    char newGameChoice = 'a';

    cout << "\n--------------------------------------------------------------------------------" << endl;
    cout << "Press N to play a new game\n";
    cout << "Press X to exit\n\n";
    cout << "--------------------------------------------------------------------------------" << endl;

    cin >> newGameChoice;
    newGameChoice = toupper(newGameChoice);

    if (newGameChoice == 'N');
    {
        char userIn = 'a';
        char c = 'a';

        game(userIn, c);
    }

    while (newGameChoice != 'N' || 'X')
    {
        cout << "--------------------------------------------------------------------------------";
        cout << "\n         Invalid input. Please try again.\n" << endl;
        cout << "--------------------------------------------------------------------------------" << endl;
        newGame();
    }
}

【问题讨论】:

  • 请提供更短的代码示例
  • 与您的问题无关,但是...您真的打算在这里进行无限递归吗?通过不让start() 调用自身,而是将对start()(在main() 内)的调用置于无限循环中,您可以获得相同的效果和更好的整体结果。
  • @Brahim 基于与此 OP 不同的帖子,他实际上正在使用 Visual Studio(您的观点当然仍然有效——而且他应该更容易在该环境中浏览代码)。
  • 我怎样才能从一开始就回到主界面?如果我没记错的话,我会简单地把 return 0;然后程序又回到main中调用它的地方?

标签: c++ input


【解决方案1】:

你的问题是这样的:

    if (begin != 'B');
    {
        ...
        cin >> begin;
        begin = toupper(begin);
        start();    <------

您再次调用start(),这会将另一个值读入begin

请在发布帮助之前花更多时间分析您的代码,这将帮助您成长为开发人员更多

【讨论】:

  • 在这里帮帮我!我认为再次调用 start() 将是获取另一个输入的最简单方法。据我所知,这会将“开始”重新初始化为“a”,然后提示用户输入新的输入。我刚刚在汇编中进行了 6 个月的编程,我们必须多次调用一个函数,有时在其内部进行简单的计算或控制用户输入、led 端口等。我接触 C 和这个也已经 6 个月了是我的第一个 c++ 程序。
  • 再次调用start()要求另一个输入——第三个。第一个是你(可能是故意的,为了测试)有坏的。第二个显示在我粘贴的代码 sn-p 中,您在其中提示他们并读入他们的输入,但您忽略了第二个输入。您不使用它,而是第二次调用start()(这将导致第三次输入)。
  • 那么使用我上面编辑的修改后的代码,这是重新提示用户输入新输入的“好习惯”方式吗?
  • 如果您应用@Brahim 的回答中给出的建议,那么只能部分应用。如果没有必要,永远不要让例程递归。不过,作为 Stack Overflow 的旁注——像你在这里所做的那样大幅改变问题的内容是一个非常糟糕的主意!微小的变化(使事情更清楚,提供额外的信息)很好,但完全改变意思(并可能损害任何以前发布的答案)不是。
【解决方案2】:
while (newGameChoice != 'N' || 'X')

等价于

while (newGameChoice != 'N' || 'X' != 0)

也许你的意思是

while (newGameChoice != 'N' || newGameChoice != 'X')

编辑: 代码错了,得重写,给个建议:

void newGame()
{
  char newGameChoice = 'a';
  while (true) {
    while (true) {
      cin >> newGameChoice;
      newGameChoice = toupper(newGameChoice);
      if (newGameChoice != 'X' && newGameChoice != 'N') {
        // Wrong input print error message
      } else {
        break;
      }
    }
    if (newGameChoice == 'X') {
      return;
    }
    game('a', 'a');
  }
}

【讨论】:

    【解决方案3】:

    您的部分问题是您的start() 方法没有以最合乎逻辑的方式设计。当前,当给出无效输入时,您尝试读取另一个输入并再次调用start()。当您第二次调用 start() 时,它会从 start() 方法的开头重新开始,而不知道之前的输入。

    您应该做的是在输入无效条目时使用while() 循环,并且在输入正确的输入之前不要继续。

    void start() 
    {
        ...
        //Get initial user input
    
        while begin != 'B'
        {
          Keep getting input if wrong
        }
    
        game(userIn, c);
    

    }

    【讨论】:

      猜你喜欢
      • 2017-07-29
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 2016-03-08
      • 2022-01-21
      相关资源
      最近更新 更多