在下面的代码中,如果输入的不是数字,程序似乎会自动连续输入该输入。由于n是一个int值,因此会将输入转换为“ 0”,但是如果实际输入“ 0”,它的行为就不会相同。
我上下看了看,似乎没有一种可靠的方式来表达
if (n != int){cout << "invalid";}
我想我的最后一招就是只允许0作为有效输入,但是我希望还有另一种方法。
int n;
cout << " \nPlease enter a number 1 to 99,999: ";
cin >> n;
while (n < 1 || n> 99999)
{
cout << "\nThat is an invalid entry!"
<< "\nPlease enter a number 1 to 99,999: ";
cin >> n;
}
答案 0 :(得分:1)
当您尝试从std::istream
之类的std::cin
提取值而提取失败时,所有数据都保留在流中,以进行下一个输入操作。如果再次尝试相同的提取,它将再次变为垃圾并失败。依此类推。
要在提取失败的情况下重复尝试从流中提取int
,则应先删除所有垃圾,然后再重试:
#inlcude <limits>
#include <iostream>
// ...
int n;
while(!(std::cin >> n)) { // extraction failed
std::cin.clear(); // clear error flags
// ignore everything left in the stream up to a newline:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
将其与限制该值限制为1到99999之间的数字相结合:
#include <limits>
#include <iostream>
int main()
{
int n;
std::cout << "Please enter a number 1 to 99999: ";
while (!(std::cin >> n) || n < 1 || 99999 < n) {
std::cerr << "Input Error!\n\n";
std::cin.clear(); // clear error flags
// ignore everything left in the stream up to a newline:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
}