[英]C++ input validation while loop not terminating
我是C ++计算机科学入门课程的学生,这是我第一次在这里发布。 我们刚刚了解了while循环,尽管该赋值不需要它,但我正在尝试对该赋值进行输入验证。 该程序旨在读取数字列表,并找出该列表中前8位和后8位的位置。 因此,如果我有四个数字(1、8、42、8)的列表,则前8个位置是2和4。该集合的大小由用户确定。
我试图进行一个while循环测试,以确保用户输入的内容实际上是一个数字,但是当我尝试输入类似“”的内容时。 或“ a”循环无限进行且不会终止。 我找不到错误,据我所知,我使用的语法与教科书中的语法完全相同。 有人可以告诉我我的while循环怎么了吗?
int numbers, //How large the set will be
num, //What the user enters for each number
first8position = 0, //The first position in the set that has an 8
last8position = 0; //The last position in the set that has an 8
//Prompt the user to get set size
cout << "How many numbers will be entered? ";
cin >> numbers;
//Loop to get all the numbers of the set and figure out
//which position the first and last 8 are in
for (int position = 1; position <= numbers; position++)
{
cout << "Enter num: ";
cin >> num;
//If num isn't a digit, prompt the user to enter a digit
while (!isdigit(num))
{
cout << "Please enter a decimal number: ";
cin >> num;
}
//If num is 8, and first8position still isn't filled,
//set first8position to the current position.
//Otherwise, set last8position to the current position.
if (num == 8)
{
if (first8position == 0)
first8position = position;
else
last8position = position;
}
}
//If the set had an 8, print what its position was
if (first8position != 0)
cout << "The first 8 was in position " << first8position << endl;
//If there was more than one 8, print the last 8 position.
//Otherwise, the first and last 8 position are the same.
if (last8position != 0)
cout << "The last 8 was in position " << last8position << endl;
else
cout << "The last 8 was in position " << first8position << endl;
//If there were no 8s, say so.
if (first8position == 0)
cout << "Sorry, no eights were entered.";
return 0;
}
导致无限循环的有两个问题:
首先,使用cin >> num
,您尝试读取一个整数值。 如果用户输入的东西像a
或.
,它不能是整数值的开头,不会读取任何内容,并且a
或.
保留在输入缓冲区中; 因此,每个随后的cin >> num
都将立即失败(因为a
或.
仍在输入缓冲区中并将保持在那里,所以没有给用户输入任何内容的机会)。 因此,在这种情况下,您将不得不使用cin
这些字符,例如,通过使用cin.ignore
,并且还必须重置在这种情况下设置的failbit
。
其次,请注意isdigit(int c)
检查ASCII值c
是否为数字,即c >= 48 && c <= 57
。 因此,直到用户输入48
到57
之间的数字,您的check isdigit(num)
才会失败。
请参阅以下代码,演示如何处理输入失败。 希望能帮助到你。
int main() {
int num;
cin >> num;
while (!cin.eof() && cin.fail()) { // failure when extracting an integral value?
cout << "not an integral value." << endl;
// clear failbit
cin.clear();
// remove characters that are still in the input buffer (until next end of line)
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// next try to read in an integer
cin >> num;
}
if (!cin.eof()) {
cout << "juu:" << num << endl;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.