Как заставить программу использовать значение по умолчанию (нажмите клавишу возврата) и разрешить пользователю вводить там собственные значения?

#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 помощью строкового ввода, а затем анализировать строку).