【问题标题】:While and Do/While Loops break unexpectedlyWhile 和 Do/While 循环意外中断
【发布时间】:2024-01-17 20:43:01
【问题描述】:

这个程序打算无限循环......所以如果有人输入 5,它会要求另一个数字(5 或 9),如果他/她输入 9,它会要求 5 或 9...... 无限循环.

using namespace std;

int main()
{
    cout << "Hello world! Enter a number" << endl;
    int x;
    cin >> x;

    while (x == 5)
    {
        std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
        cout << "Try again, you got 5" << endl;
        cin >> x;

    }

    while (x == 9)
    {
        cout << "You got 9, try again mate" << endl;
        std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
        cin >> x;
    }
return 0;
}

但我不明白当我切换数字时(如“5”到“9”再回到“5”),程序就停止了。

我认为是因为在Loop #1和Loop #2执行完后,程序永远不会返回其中一个,而是直接继续“返回0”,但我不知道如何让程序返回两个循环。

PS:我尝试切换到 do-while 循环并将“cin”语句从括号中取出,但它们并没有解决问题。

【问题讨论】:

  • 我对 C++ 不是很熟悉,但我认为循环应该类似于 while(has number){ if(num = 5){ do something } if(num = 9){ do something } }
  • "我想要一个无限循环" 不写无限循环 "怎么了?"嗯...
  • @LightnessRacesinOrbit 你一定有点慢......这正是我问这个问题的原因。谢天谢地,它已得到答复
  • @OpenTheCSV:是的,我很慢,我从不帮助任何人。
  • @OpenTheCSV:Stack Overflow 不仅仅是“帮助”。这是一个针对各个时代的问答存储库,因此,您应该(不,必需)使您的问题对其他人有用。这个不满足这个要求。 Stack Overflow 不是您自己的私人免费帮助台。谢谢。

标签: c++ while-loop do-while


【解决方案1】:

您的代码没有给出所需的行为,因为当第二个 while 循环结束时,您不会重复该过程并且程序结束。

所以您想要循环直到用户输入某个数字除了59
为了做到这一点,我们使用while 循环运行到无穷大,如果用户输入一些不同于59.

您可以像这样修改您的代码:

using namespace std;

int main()
{
    cout << "Hello world! Enter a number" << endl;
    int x;

    while(1){
        cin >> x;
        std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
        if(x == 5)
            cout << "Try again, you got 5" << endl;
        else if(x == 9)
            cout << "You got 9, try again mate" << endl;
        else
            break;        
    }

    return 0;
}

【讨论】:

    【解决方案2】:

    正如@Billy 在 cmets 中所说,您的逻辑有缺陷。首先,如果你想要一个 infinite 循环,只要某个数字等于 5 或​​ 9,就不要循环。然后,在循环中,只需检查要生成的数字是多少正确的输出。

    #include<iostream>
    using namespace std;
    
    int main()
    {
        int x;
    
        cout << "Hello world! Enter a number" << endl;
    
        while(1)
        {
            cin >> x;
            std::cin.ignore (std::numeric_limits<std::streamsize>::max(), '\n');
            if(x == 5) cout << "Try again, you got 5" << endl;
            if(x == 0) cout << "You got 9, try again mate" << endl;
        }
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      删除此行:std::cin.ignore (std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
      有了它,您将不会读取输入。

      在您的示例中,没有无限循环。我建议为每个值调用一个函数:

      inline void five(int &x)
      {
          std::cout << "Try again, you got 5" << std::endl;
          std::cin >> x;
      }
      
      inline void nine(int &x)
      {
          std::cout << "You got 9, try again mate" << std::endl;
          std::cin >> x;
      }
      
      inline void other(int &x)
      {
          std::cout << "Try again: ";
          std::cin >> x;
      }
      
      int main()
      {
          std::cout << "Hello world! Enter a number" << std::endl;
          int x{};
          std::cin >> x;
          bool running{true};
      
          while (running) {
              if (x == 5) five(x);
              else if (x == 9) nine(x);
              else other(x);
          }
      }
      

      【讨论】: