我的程序存在问题。我正在构建一个金字塔程序,以便更好地理解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;
}
我研究过并发现没有类似的问题,最常见的问题似乎是人们没有设定条件。
答案 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';
}
答案 2 :(得分:0)
如果输入有效,您将验证。请查看以下代码..
if(!(cin >> height))
{
//print invalid input
break;
}
您也可以查看cin.fail()
答案 3 :(得分:0)