Завершите цикл while, который продолжает запрашивать ввод строки, пока я не введу -1

Мне нужно создать меню, содержащее имена элементов, я могу сделать это с помощью цикла for, который заканчивается до тех пор, пока не будет достигнуто максимальное значение, но как мне это сделать с помощью цикла while, который будет продолжать спрашивать до тех пор, пока не будет достигнуто максимальное значение или я не ввожу -1

Я пробовал с циклом for, и это сработало, но я должен использовать цикл while, который может остановиться, когда я скажу ему остановиться.

#include <iostream>

using namespace std;

void read_in_menu(char menu_list[][50], float price_list[], int& num_menu_items,
                  int MAX_MENU_ITEMS);

int main()
{
    const int MAX_MENU_ITEMS = 5;
    char menu_list[MAX_MENU_ITEMS][50];
    float price_list[MAX_MENU_ITEMS];
    int num_menu_items;

    read_in_menu(menu_list, price_list, num_menu_item, MAX_MENU_ITEMS);
}

void read_in_menu(char menu_list[][50], float price_list[], int& num_menu_items,
                  int MAX_MENU_ITEMS)
{
    for (int i = 0; i < MAX_MENU_ITEMS; i++)
    {
        cout << "Enter Names: ";
        cin.getline(menu_list[i], 20);
    }
}

Я хочу использовать цикл while, который будет продолжаться до тех пор, пока я не введу -1 или не достигну максимума. Я хочу остановить цикл while, когда захочу, вместо цикла for, где я должен достичь максимума.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
74
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Всякий раз, когда вы хотите выйти из цикла, вы можете использовать ключевое слово break.

for(int i = 0; i < MAX; i++){
    if (i > 10){
        break;
    }
    doWork();
}

Вы также можете использовать break в цикле while.

Ace 22.06.2019 00:02

Вы можете преобразовать петлю for в другие петли. Например:

Для

for(int i = 0; i < 10; i++)
    DoSomething();

Пока

int i = 0;
while(i < 10){
    DoSomething();
    i++;
}

делать пока

int i = 0;
do{
    DoSomething();
    i++;
}
while(i < 10);

Для управления циклами используйте ключевые слова continue и break. Ключевое слово continue пропустит текущую итерацию цикла, а break выйдет из цикла. Обычно они обусловлены утверждением if.

Ответ принят как подходящий

Если я правильно понимаю, должно работать что-то вроде этого:

int i = 0;
string input = "";
while(i < MAX_MENU_ITEMS || input == "-1") {
    cout << "Enter Names: ";
    cin.getline(input, 20);
    if (input != "-1") { //to avoid setting menu_list[i] = "-1"
        menu_list[i] = input;
    }
    MAX_MENU_ITEMS++;
}

или используя перерыв:

int i = 0;
string input = "";
while(i < MAX_MENU_ITEMS) {
    cout << "Enter Names: ";
    cin.getline(input, 20);
    if (input == "-1") { 
        break;
    }
    menu_list[i] = input;
    MAX_MENU_ITEMS++;
}

Привет спасибо! Я смог понять это с помощью указателя, но я также сохранял -1 как одну из строк, ваша решает эту проблему!

Johnny Jia 22.06.2019 00:17

Я рекомендую небольшую очистку: cin.getline(input, 20); не будет компилироваться. Эта конкретная форма getline не примет std::string. menu_list[i] = input; тоже не получится. Вы не можете присвоить std::string массиву char. Либо используйте std::getline и указывайте std::string везде (значительно лучший вариант), либо страдайте от того, что все является массивом char (Superyuck).

user4581301 22.06.2019 02:10

Я смог получить его с помощью указателя, лол.

void read_in_menu(char menu_list[5][20], float price_list[], int &num_menu_items, int MAX_MENU_ITEMS){
int i = 0;
char *p = "-1";
while(i<MAX_MENU_ITEMS){
cout << "Enter Name" << endl;
cin.getline(menu_list[i],20);
if (strcmp(menu_list[i], p)){
i++;
}else{
break;
}
}
}

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

Динамически создавать объекты набора данных для построения многострочных графиков, используя предопределенные массивы объектов набора данных (JavaScript/Chart.js)
Как упростить операторы else-if, в которых оценка текстовой строки имеет то же имя, что и массив, к которому добавляется? (JavaScript)
Использование шрифта awesome на ванильном JavaScript
Как искать значение в массиве внутри другого массива
JavaScript: могу ли я сортировать строку в массиве (невозможно нормальное использование сортировки)
Деконструкция массива с шагом два
Как нажать на индекс массива, который еще не существует
Самый быстрый/самый элегантный способ проверить, что 2D-массив имеет одинаковую длину для каждой строки?
Преобразовать массив байтов в строку? Разработка прошивки ESP32 BLE
Проверьте, не существует ли элемент таблицы. Как проверить возвращенный массив «Элементы», если он пуст? Javascript/DynamoDB