Проблемы cin-буфера в C ++ - PullRequest
       134

Проблемы cin-буфера в C ++

1 голос
/ 13 апреля 2020

Я изучаю C ++, поэтому я не до конца понимаю, что происходит с моим кодом, но из того, что я смог найти, кажется, что это может быть какой-то проблемой с буфером.

#include <stdio.h>
#include <vector>
#include <iostream>
#include <typeinfo>

using namespace std;

bool stopRun = true;
int height, average, total, count;
vector <int> heights;

int main ()
{
    while (stopRun)
    {
        cout << "Enter a height, or 'end' to quit: ";
        cin >> height;
        if (typeid(height).name() == "i")
        {
            heights.push_back(height);
            cout << heights[0];
            count++;
        }
        else if (typeid(height).name() == "i")
        {
            cout << "\nPlease enter an integer: ";
            continue;
        }
        if (count == 5)
        {
            stopRun = false;
        }
    }
    for (int i = 0; i < heights.size(); i++)
    {
        total += heights[i];
        cout << "\nTotal: " << total;
    }
    return 0;
}

По какой-то причине этот код будет постоянно выводить: «Введите высоту или« конец »для выхода:». В более ранней версии было бы выведено: «Введите высоту или« конец »для выхода: введите целое число:».

Что я думаю, так это то, что мой "cin >> height"; строка выводит результат из «Пожалуйста, введите целое число:» и обрабатывает его как мой ввод, который идентифицирует его как не целочисленный тип, который запускает бесконечный l oop.

Как очистить входной буфер, чтобы он не вводил операторы cout? Или это даже проблема, которую я испытываю здесь?

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 13 апреля 2020
if (string(typeid(height).name()) == "i")

Что вы ошиблись, так это сравнение указателя и строки. Поскольку typeid (height) .name () возвращает указатель на c -строку с именем объекта.

0 голосов
/ 13 апреля 2020

вы можете использовать эту функцию при запуске вашей программы fflu sh (stdin). Это очистит ваш входной буфер.

0 голосов
/ 13 апреля 2020

Вы пытаетесь прочитать int и string в одной строке кода. Я предлагаю вам использовать getline(), чтобы прочитать ввод и попытаться преобразовать string в int.

std::string input;
while (heights.size() != 5) {
    cout << "Enter a height, or 'end' to quit: ";
    if (std::getline(cin, input)) {
        if (input == "end") break;
        try {
            heights.push_back(std::stoi(input));
        }
        catch (std::invalid_argument e) {
            cout << "\nPlease enter an integer: ";
        }
    }
}
0 голосов
/ 13 апреля 2020

Предлагаю поймать струну. Если строка не является "концом", тогда конвертируйте в число внутри try / catch

...