C++ 如何捕获无效的用户输入

C++ 如何捕获无效的用户输入,c++,C++,我不理解Try、throw、catch语句,我想知道,当代码中的所有输入都应该是int时,为什么捕获一个char是最好的选择。这是为了帮助人们避免在我询问他们最喜欢的数字时愚蠢地输入“a”。下面是我试图保护的代码的一个示例,当我需要int时,有人输入char: int a, b; std::cout << "Enter a Numerator: "; std::cin >> a; std::cout << "Enter a Denominator: "; st

我不理解Try、throw、catch语句,我想知道,当代码中的所有输入都应该是int时,为什么捕获一个char是最好的选择。这是为了帮助人们避免在我询问他们最喜欢的数字时愚蠢地输入“a”。下面是我试图保护的代码的一个示例,当我需要int时,有人输入char:

int a, b;
std::cout << "Enter a Numerator: ";
std::cin >> a;
std::cout << "Enter a Denominator: ";
std::cin >> b;
inta,b;
std::cout>a;
std::cout>b;

如果您将两个问题中的两个答案合并在一起(和),我在您的问题的评论部分提到了这一点,您将得到:

#include <iostream>

int main()
{
    int a, b;
    std::cout << "Enter a Numerator: ";
    std::cin >> a;
    std::cout << "Enter a Denominator: ";
    std::cin >> b;

    if (!std::cin.good())
    {
        throw std::invalid_argument( "received strings. Need integers" );
    }
}

为了更细粒度地控制输入例程,您需要学习使用流状态
goodbit、eofbit、badbit和failbit
。您可以直接使用或使用方便的成员函数
.good()、.eof()、.bad()和.fail()检查状态,请参阅

检查
.good()
会告诉您输入正确,但它不能帮助您从失败的输入或错误条件或
EOF
中恢复。为此,您必须单独检查发生的错误情况

继续我的评论并添加一点细节,您可以执行以下操作(您对
a
b
执行相同的操作,您可以移动到函数或成员函数),例如

用户在Linux上使用Ctrl+d(或在windows上使用Ctrl+z)取消输入


仔细检查一下,如果您有问题,请告诉我。

为了避免什么,确切地说?我将永远看到这一点的可能重复。用户键入字符和字符串,而不是整数。将输入作为字符串读取并进行您自己的验证。或者最好查看一下。当谈论
cin
时,处理错误的最佳方法是
if(!(std::cin>>a))
然后检查是否发生了不可恢复的错误,例如
eofbit
badbit
设置为
如果(std::cin.eof()| std::cin.bad())
或是否发生了可恢复的错误,例如设置了
failbit
,使用
else检查是否(std::cin.fail())
之后
std::cin.clear()来清除
故障位
。谢谢,这是一个巨大的帮助。我想我已经开始理解试球、掷球和接球的指令了。我只需要从另一个角度看它。非常感谢。很高兴能帮上忙。:)
if (b /*assuming b is denominator*/ == 0) {
        throw std::overflow_error("Divide by zero exception");
}
#include <iostream>
#include <limits>

int main (void) {

    int a, b;

    /* get input for a */
    while (1)       /* loop continually reading input */
    {
        std::cout << "\nenter an integer for a: ";
        if (! (std::cin >> a) ) {   /* check stream state */
            /* if eof() or bad() break read loop */
            if (std::cin.eof() || std::cin.bad()) {
                std::cerr << "(user canceled or unreconverable error)\n";
                goto unrecoverable;
            }
            else if (std::cin.fail()) {     /* if failbit */
                std::cerr << "error: invalid input.\n";
                std::cin.clear();           /* clear failbit */
                /* extract any characters that remain unread */
                std::cin.ignore(std::numeric_limits<std::streamsize>::max(),
                                '\n');
            }
        }
        else {  /* on succesful read, just output int and break loop */
            std::cout << "integer a: " << a << '\n';
            /* extract any characters that remain unread */
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(),
                            '\n');
            break;
        }
    }

    /* same thing for b */
    while (1)       /* loop continually reading input */
    {
        std::cout << "\nenter an integer for b: ";
        if (! (std::cin >> b) ) {   /* check stream state */
            /* if eof() or bad() break read loop */
            if (std::cin.eof() || std::cin.bad()) {
                std::cerr << "(user canceled or unreconverable error)\n";
                break;
            }
            else if (std::cin.fail()) {     /* if failbit */
                std::cerr << "error: invalid input.\n";
                std::cin.clear();           /* clear failbit */
                /* extract any characters that remain unread */
                std::cin.ignore(std::numeric_limits<std::streamsize>::max(),
                                '\n');
            }
        }
        else {  /* on succesful read, just output int and break loop */
            std::cout << "integer b: " << b << '\n';
            /* extract any characters that remain unread */
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(),
                            '\n');
            break;
        }
    }

    unrecoverable:;
}
$ ./bin/cin_validate_ab

enter an integer for a: no
error: invalid input.

enter an integer for a: OK
error: invalid input.

enter an integer for a: 5, I entered 5!
integer a: 5

enter an integer for b: again!
error: invalid input.

enter an integer for b: 6
integer b: 6
$ ./bin/cin_validate_ab

enter an integer for a: (user canceled or unreconverable error)