Цикл 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
Вы бы не увидели эту проблему. Разве это не то, что вы хотите в любом случае?