Цикл C++ работает вечно, не ожидая ввода

Я пытаюсь написать код, который будет зацикливать и вводить пользовательский ввод в класс и распечатывать диаграмму. Это мой основной метод:

int main()
{
    Company productMatrix;
    int inputNumber = 0;
    cout << "enter the salesman id or -1 to quit." << endl;
    cin >> inputNumber;
    while(inputNumber != -1)
    {
        int salesman = inputNumber;
        cout << "enter the product id." << endl;
        cin >> inputNumber;
        int product = inputNumber;
         cout << "enter the amount sold." << endl;
        cin >> inputNumber;
        double dollarValue = inputNumber;
        productMatrix.inputSales(salesman, product, dollarValue);
        cout << "enter the salesman id or -1 to quit." << endl;
        cin >> inputNumber;
    }
    productMatrix.printChart();
    cout << "Goodbye!";
    return 0;
}

когда я запускаю программу, она позволяет мне вводить один набор данных, а затем зацикливаться, не дожидаясь остановки. Вот как это выглядит:

enter the salesman id or -1 to quit.
3
enter the product id.
2
enter the amount sold.
55.99
enter the salesman id or -1 to quit.
enter the product id.
enter the amount sold.
enter the salesman id or -1 to quit.
enter the product id.
enter the amount sold.
// etc...

Я предполагаю, что что-то не так с моей петлей. Как я могу это лисить?

4 ответа

Ты пишешь двойной 55.99 в целое число, так cin занимает 55 и имеет '.' в буфере, который всегда !=-1 но никогда не читается как целое число.

Проблема в следующей строке.

double dollarValue = inputNumber;

inputNumber - целочисленный тип, а значение доллара - число с плавающей запятой. Так что есть несоответствие типов. Вы можете создать другую переменную, такую ​​как dollarInput, и хранить там значение в долларах.

Чтобы добавить ответ праймуса, вы можете увидеть дополнительный "мусор" во входном потоке, добавив следующее чтение "cin":

...
double dollarValue = inputNumber;
productMatrix.inputSales(salesman, product, dollarValue);
cout << "enter the salesman id or -1 to quit." << endl;

double myDbl;
cin >> myDbl;
cout << "read the following double:" << myDbl << endl;
...

Добавленный "cin >> myDbl" будет читать ".99" из входного потока, а добавленный cout даст:

0.99

inputNumber является int, Но вы ввели значение (55,99), которое не может быть интерпретировано как int, Это поставить cin в состояние ошибки. Пока ошибка не будет устранена, все будущие операции с cin потерпеть поражение. Так что он не ждет вашего ввода, а переменные сохраняют свои значения, и вы никогда не сможете получить это -1 что цикл должен завершиться.

Чтобы проверить наличие ошибки, просто используйте старый старый оператор if:

if (cin) {
    // cin is okay
}
else {
    // cin is not okay
}

Вы также можете быть немного более кратким и поместить свою операцию ввода непосредственно в if Постулаты:

if (cin >> inputNumber) {

Чтобы убрать ошибку:

cin.clear();

Вам также, вероятно, потребуется очистить входной поток, в противном случае ошибочный ввод останется во входном буфере, и cin просто попробую прочитать снова:

cin.ignore(); // discard one character from the input buffer
// or
cin.ignore(N); // discard N characters from the input buffer

Во всяком случае, это причина бесконечного цикла. Но если вы только что внесли вклад непосредственно в doubleвместо intВы бы не увидели эту проблему. Разве это не то, что вы хотите в любом случае?

Другие вопросы по тегам