尝试使用负整数函数捕获

时间:2019-02-21 07:15:06

标签: c++ exception-handling

所以基本上我想让它停止重复。如果我正确输入数字,则可以正常工作。如果我输入不允许的负数并且需要try-catch异常,它将不断重复,并且不会停止询问数字。 我所拥有的只是该代码的源文件,我正在尝试为main创建一个函数。

#include <iostream>
#include <iomanip>
#include <string>

using namespace std;

void gcd(int x, int y);

int main()
{
    int x;
    int y;
    cout << "Please enter two integer values" << endl;
    cin >> x;
    cin >> y;
    gcd(x, y);

    return 0;
}

void gcd(int x, int y)
{
    int gcd;
    int s = 0;
    while (s == 0)
    {
        try
        {
            if (x < 0 || y < 0)
                throw 1;
            else
            {
                s == 1;
                break;
            }
        }
        catch (int x)
        {
            cout << "Wrong negative input please type in two Positive integers" << endl;
            cin >> x >> y;
            continue;
        }
    }
    for (int i = 1; i <= x && i <= y; i++)
    {
        if (x % i == 0 && y % i == 0)
            gcd = i;
    }
    cout << "The gcd of x: " << x << " and y: " << y << " is: " << gcd << endl;
}

2 个答案:

答案 0 :(得分:1)

如果您不希望使用负值调用函数gcd(),请抛出std::invalid_argument异常。 gcd()的业务不是请求用户输入。调用main()之前,请验证gcd()中的输入。

#include <limits>
#include <stdexcept>
#include <iostream>

int gcd(int, int);

int main()
{
    int x, y;
    while (std::cout << "Please enter two positive integers: ",
           !(std::cin >> x >> y) || x < 0 || y < 0)
    {
        std::cerr << "Input error :(\n\n";
        if (std::cin.fail()) {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        }
    }

    std::cout << "The gcd of x: " << x << " and y: " << y << " is: " << gcd(x, y) << "\n\n";
}

int gcd(int x, int y)
{
    if (x < 0 || y < 0)
        throw std::invalid_argument("No negative arguments to gcd(), please :(");
    return y == 0 ? x : gcd(y, x % y);
}

答案 1 :(得分:0)

您可以(也许应该)从gcd函数中删除逻辑,而是将其放在您从用户那里得到输入的地方,即main中。另外,请预先说明要求。例如:

int main()
{
    int x;
    int y;
    cout << "Please enter two positive integer values" << endl;
    cin >> x;
    cin >> y;
    if (x < 0 || y < 0)
    {
        cout << "Wrong negative input please type in two Positive integers" << endl;
        return 0;
    }

    gcd(x, y);

    return 0;
}

现在,您可以在gcd中放置断言以强制没有负值进入:

void gcd(int x, int y)
{
    assert(x >= 0);
    assert(y >= 0);
    // ...
}