#c
Вопрос:
У меня возникли некоторые проблемы со следующей программой. Когда я использую Returnключ, все работает нормально. Однако, когда я пытаюсь ввести те же самые значения, это не работает. До того, как я запрограммировал его на прием Returnключа, введенные данные работали. Похоже, я могу заставить работать только одно или другое, но не оба, в одной и той же программе.
//#include Statement(s)
#include <iostream>
#include <string>
//using Statement
using namespace std;
int main()
{
//variable declaration(s)
int cookies, boxes, cookieTotal, boxTotal, containerTotal, cookiesLeft, boxesLeft;
//executable statements
//inputs
cout << "Press Enter to use the default setting of 24 or input the number of cookies per box: ";
if (cin.get() == 'n') { // detect 'enter' default
cookies = 24;
cout << "24" << endl;
}
else {
cin >> cookies;
}
cout << "Press Enter to use the default setting of 75 or input the number of box per container: ";
if (cin.get() == 'n') { // detect 'enter' default
boxes = 75;
cout << "75" << endl;
}
else {
cin >> boxes;
}
cout << "Input the total about of cookies: ";
cin >> cookieTotal;
//processes
boxTotal = cookieTotal / cookies;
containerTotal = boxTotal / boxes;
cookiesLeft = cookieTotal - (boxTotal * 24);
boxesLeft = boxTotal - (containerTotal * 75);
//outputs
cout << "The total number of boxes: " << boxTotal << endl;
cout << "The total number of containers: " << containerTotal << endl;
cout << "Leftover cookies: " << cookiesLeft << endl;
cout << "Leftover boxes: " << boxesLeft << endl;
//return statement
char q;
cout << "nPress any key to Exit.";
cin.ignore(2, 'n');
cin.get(q);
return 0;
}
Комментарии:
1. Поведение
>>
оператора по умолчанию состоит в том, чтобы считывать один маркер, разделенный пробелами, и отбрасывать все предыдущие пробелы. Новая строка-это пробел, поэтому вы не можете прочитать новую строку с>>
помощью … Если только ты не продолжишь .noskipws
2. Если вы
get()
попытаетесь определить ВВОД, вы в конечном итоге прочитаете первую цифру пользователя, которая затем будет недоступна для>>
чтения. Я бы использовалstd::getline()
чтение при вводе до ВВОДА в строку, и если строка не пуста , то преобразуйте ее в целое число сstd::stoi()
помощью , например:getline(cin, input); if (input.empty()) { input = "24"; } cookies = stoi(input);
, и то же самое дляboxes
и т. Д3. Форматированный ввод с использованием
<<
, ориентированный на символы ввод , подобныйcin.get()
вводу символов, и строковый ввод, такие какcin.getline()
различные стили, которые по-разному обрабатывают пробелы (<<
игнорирует пробелы и возвращает первый символ, не являющийся пробелом,cin.get()
возвращает пробелы вызывающему объекту,cin.getline()
останавливается на новой строке, не читая ее). Ваш код смешивает стили, которые вызывают проблемы, подобные тем, которые вы видите, в зависимости от ввода пользователя. Решение состоит в том, чтобы НИКОГДА не смешивать стили ввода в потоке (например, считывать все данные сcin
помощью строкового ввода, а затем анализировать строку).