C ++如何在收到字符而不是整数时防止程序无休止地重复输入?

时间:2018-09-26 01:33:09

标签: c++

在下面的代码中,如果输入的不是数字,程序似乎会自动连续输入该输入。由于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;
}

1 个答案:

答案 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');
    }
}