после срабатывания catch выходит из программы

Рейтинг: -1Ответов: 1Опубликовано: 05.08.2023
#include <iostream>
void program1 ()
{
    unsigned int a, b, s;
    std::cout << "\nThe program for adding two natural numbers.\nEnter terms separated by spaces: ";
    try
    {
        std::cin >> a >> b;
    }
    catch(...)
    {
        std::cout << "\nInput error!!!";
        return;
    }
    if (a == 0 || b == 0)
    {
        std::cout << "\nInput error!!!";
        return;
    }
    std::cout << "Sum = " << a + b;
}
int main()
{
    bool answer;
    program1();
    std::cout << "\nOne more? (1 - yes, 0 - no): ";
    std::cin >> answer;
    if (answer)
    {
        main();
    }
    return 0;
}

когда срабатывает catch (например, вводятся буквы), программа выводит One more? (1 - yes, 0 - no):, но не ждет ввода std::cin >> answer;. подскажите, пожалуйста, как исправить.

Ответы

▲ 1Принят

Когда срабатывает catch (а вот срабатывает ли он у вас? мне кажется, что вылетаете вы по второму признаку, if (a == 0 || b == 0), просто считаете, что это исключение... а на самом деле никакого исключения нет), у вас явно cin в состоянии fail, так что в строке std::cin >> answer; просто ничего не читается (из потока в состоянии fail), и вы вылетаете из программы.

И, кстати, main() рекурсивно вызывать — очень плохо пахнет... Я бы делал так:

void program1 ()
{
    unsigned int a, b, s;
    std::cout << "\nThe program for adding two natural numbers.\nEnter terms separated by spaces: ";
    if (!(std::cin >> a >> b))
    {
        std::cout << "\nInput error!!!";
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
    else std::cout << "Sum = " << a + b;
}
int main()
{
    for(int answer = 1; answer;)
    {
        program1();
        std::cout << "\nOne more? (1 - yes, 0 - no): ";
        std::cin >> answer;
    }
}