Завершение входного потока указанным символом, например '|'?

Aug 21 2020

В настоящее время изучаю C ++, новичок.

У меня проблема при завершении ввода символом "|" символ, моя программа перескакивает до конца / заканчивается и не позволяет дальнейший ввод. Я считаю, что это связано с тем, что std :: cin находится в состоянии ошибки из-за ввода символа при ожидании int, поэтому я попытался использовать std :: cin.clear () и std :: cin.ignore () для очистки проблема и разрешить выполнение оставшейся части программы, но я все еще не могу ее взломать, любые советы приветствуются.

int main()
{
    std::vector<int> numbers{};
    int input{};
    char endWith{ '|' };

    std::cout << "please enter some integers and press " << endWith << " to stop!\n";
    while (std::cin >> input)
    {
        if (std::cin >> input)
        {
            numbers.push_back(input);
        }
        else
        {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max());
        }
    }

А затем передайте вектор в функцию, чтобы выполнить итерацию x раз и добавить каждый элемент к итогу, но программа всегда пропускает ввод пользователя:

std::cout << "Enter the amount of integers you want to sum!\n";
    int x{};
    int total{};
    std::cin >> x;


    for (int i{ 0 }; i < x; ++i)
    {
        total += print[i];
    }

    std::cout << "The total of the first " << x << " numbers is " << total;

Пожалуйста помоги!

Ответы

1 JohnnyMopp Aug 21 2020 at 01:54

Когда использование входит в "|" (или что-либо, кроме int), цикл завершается и обработка ошибок внутри цикла не выполняется. Просто переместите код ошибки за пределы цикла. Кроме того, вы читаете stdinдважды, что пропустит каждый второй int.

while (std::cin >> input) {
    numbers.push_back(input);
}
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Примечание. Если вы хотите специально отметить "|" может измениться на что-то вроде этого:

while (true) {
    if (std::cin >> input) {
        numbers.push_back(input);
    }
    else {
        // Clear error state
        std::cin.clear();
        char c;
        // Read single char
        std::cin >> c;
        if (c == '|') break;
        // else what to do if it is not an int or "|"??
    }
}
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');