Do While:永无止境循环的问题

时间:2014-02-22 05:02:45

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

我的程序存在问题。我正在构建一个金字塔程序,以便更好地理解C ++中的循环结构。 问题是当我构建并运行它时,我会:

   cout << "\nPlease enter the number of lines for your pyramid: ";
   cin >> height;

我键入一个随机字符,如'K',它会连续(永不结束)循环开始:

   cout << "ERROR: Please enter a value between 3 and 25!" << endl;

我的问题:为什么它会不断循环?               可以实施什么来解决这个问题?

#include <iostream>
#include <limits>

using namespace std;


void draw(int height)
{
    for(int line = 0;line<=height;line++)
    {
        int spaces = height - line;

        for(int j=1;j<=spaces;j++)
        cout<<" ";
        for(int i=1;i<=line*2+1;i++) 
        cout<<"+";
        cout<<"\n";
    }
}


int main()
{
  int height;
  do{
  cout << "\nPlease enter the number of lines for your pyramid: ";
  cin >> height;
  if(height>3 && height<25)draw(height);

  else{
     cout << "ERROR: Please enter a value between 3 and 25!" << endl;
  }
  }while(height<3 || height>25);
  cout << "\n";

  return 0;
}

我研究过并发现没有类似的问题,最常见的问题似乎是人们没有设定条件。

4 个答案:

答案 0 :(得分:2)

这是因为您已将height声明为int,并且只要cin看到正在输入的char,就会跳过而不接受输入。因此输入保留在输入缓冲区中,height保留其旧值。在这种情况下,它的垃圾值和它意外地不在3到25之间。因此,infinte循环。

如果要在输入非整数时中断,请使用cin.fail()

int Item;
cin >> Item;
while (! cin.fail())
   {
   Process(Item);
   cin >> Item;
}

编辑:根据您的评论添加答案,以字符串形式输入。检查每个位置是否为非数字。如果它是一个有效的整数,请使用atoi()将其转换为整数。

答案 1 :(得分:2)

问题是流输入操作符>>将尝试仅读取对您输入的类型有效的输入:

int i;
std::cin >> i;

只会读取整数值。如果失败,它会设置一个可以使用std::cin::fail()

进行测试的标志
int i;
std::cin >> i;
if (cin.fail())
    throw std::invalid_argument("Expected an int, got some other junk");

然而,这会在输入流中留下输入,让您使用各种机制中的一种来解决它。

最简单的方法是使用std::getline一次读取输入行。

#include <string>
#include <iostream>
#include <cctype>
#include <cstdlib>

int main() {
    std::string input;
    int i = 0;

    while (std::cin.good()) {
        std::cout << "Enter a number between 3 and 25: ";
        std::getline(std::cin, input);
        if (input.empty()) // blank lines
            continue;
        if (isdigit(input[0])) {
            i = atoi(input.c_str());
            if (i < 3 || i > 25) {
                std::cout << "Invalid number, " << input << '\n';
                continue;
            }
            // valid input, stop the loop
            break;
        }

        std::cout << "Unrecognized/non-numeric input: \"" << input << "\"\n";
    }

    if (i == 0) // we left the loop because cin.good() was false
        return 0;

    std::cout << "You entered " << i << '\n';
}

现场演示:http://ideone.com/KRHM3V

答案 2 :(得分:0)

如果输入有效,您将验证。请查看以下代码..

if(!(cin >> height))
{
    //print invalid input
    break;
}

您也可以查看cin.fail()

答案 3 :(得分:0)

阅读fail

后,您需要检查height

请参阅 - fail bit

如果无法读取整数,则设置此项。然后,您需要吃一些输入并发出消息