【问题标题】:do while loops can't have two cin statements?while 循环不能有两个 cin 语句吗?
【发布时间】:2012-05-29 15:27:20
【问题描述】:

我只是在学习关于 do/while 循环的简单 c++ 教程,我似乎完全复制了教程中写的内容,但我没有得到相同的结果。这是我的代码:

int main()
{
    int c=0;
    int i=0;
    int str;
    do
    {
        cout << "Enter a num: \n";
        cin >> i;
        c = c + i;
        cout << "Do you wan't to enter another num? y/n: \n";
        cin >> str;

    } while (c < 15);

    cout << "The sum of the numbers are: " << c << endl;


    system("pause");
    return (0);
}

现在,在 1 次迭代之后,循环只是运行而无需再次询问我的输入,并且仅使用我的第一个初始输入为 i 计算总和。 但是,如果我删除第二对 cout/cin 语句,程序运行正常..

有人能发现我的错误吗?谢谢!

【问题讨论】:

  • 这是什么教程?它完全忽略了y/n答案的内容,只在总和小于15时进行迭代
  • 我认为str 应该是std::string 的类型。
  • @maverik,如果只是 y/n,则更像 char
  • @chris:当然。它甚至可以保留为int,但对我来说看起来很奇怪。
  • ah.. 抱歉,原始教程将 while (str == 'y') 作为终止条件,但即使我在第一次迭代后输入 'y' ,它也会退出整个循环并打印我的第一个输入 i 作为总和..

标签: c++ cin do-while


【解决方案1】:

在您使用cin &gt;&gt; str; 读取字符串后,输入缓冲区中仍有新行。当您在下一次迭代中执行 cin &gt;&gt; i; 时,它会读取换行符,就像您只是按 enter 而不输入数字一样,因此它不会等待您输入任何内容。

通常的解决方法是在阅读字符串后输入cin.ignore(100, '\n'); 之类的内容。 100 或多或少是任意的——它只是限制了它将跳过的字符数。

【讨论】:

  • 如果他们想跳过所有内容直到换行,总是可以使用std::numeric_limits&lt;std::streamsize&gt;::max() 而不是100
  • @Fanael:你可以,而且有时这是有道理的。但这并不像很多人想象的那么频繁——如果你真的得到了很多意想不到的输入,那么停下来告诉用户这个问题通常比告诉用户问题更有意义。当明显存在问题时,浪费大量时间。
【解决方案2】:

如果你改变了

int str;

char str;

您的循环按您的预期工作(在 Visual Studio 2010 中测试)。
不过,您可能还应该检查str == 'n',因为他们告诉您他们已经完成了。

【讨论】:

    【解决方案3】:

    ...并且仅使用我的第一个初始输入为 i...计算总和...

    这是一种预期行为,因为您只是在阅读str 而没有使用它。如果输入i &gt;= 15,则循环必须中断,否则继续。

    【讨论】:

      【解决方案4】:

      我想你想要这个东西

      在这种情况下,总和 c 将小于 15,如果用户输入 y,则继续求和。

      #include<iostream>
      using namespace std;
      int main()
      {
          int c=0;
          int i=0;
          char str;
          do
          {
              cout << "Enter a num: \n";
              cin >> i;
              c = c + i;
              cout << "Do you wan't to enter another num? y/n: \n";
              cin >> str;
      
          } while (c < 15 && str=='y');
      
          cout << "The sum of the numbers are: " << c << endl;
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 2012-12-02
        • 2012-05-20
        • 2017-06-21
        • 2015-05-19
        • 1970-01-01
        相关资源
        最近更新 更多