функция ввода с консоли не заканчивается внутри цикла - PullRequest
0 голосов
/ 18 октября 2018

Я хочу создать простое пользовательское меню в консоли, где я могу запустить некоторые функции, набрав 1, 2, 3 ... но есть проблема с пользовательским вводом (внутри cap_console.cpp), так какмоя программа не достигнет операторов if и не завершится.

Пока мой код:

main.cpp

#include <iostream>
#include "cab_console.h"

int main(int argn, char ** argv){
    cab_console CONSOLE_MENU;
    CONSOLE_MENU.console();
}

cab_console.h

#ifndef CAB_CONSOLE_H
#define CAB_CONSOLE_H


class cab_console
{
public:
    char input;
    cab_console();

    void menu();
    void quit_console();
    void console();
};

#endif // CAB_CONSOLE_H

cab_console.cpp

void cab_console::console(){
char input = '0';
cout << "This is the menu." << endl;

while(input != 'Q') {
    cout << "Choose an action:" << endl;
    cout << "1 - Create ..." << endl;
    cout << "2 - Show ..." << endl;
    cout << "3 - Repeat ..." << endl;
    cout << "Q - Quit..." << endl;

    cin >> input;

    if(input == '1') {
        cout << "use function1 here..." << endl;
        cab_console::console();
    }
    if(input == '2'){
        cout << "use function2 here..." << endl;
        cab_console::console();
    }

    if(input == '3') {
        cout << "use function3 here..." << endl;
        cab_console::console();
    }
    if(input == 'Q'){
        cout << "Quit console..." << endl;
        cab_console::quit_console();
    }
    else{
        cout << "Its not a valid input.";
        cab_console::console();
    }
}
}

Это мой вывод

This is the menu.
Choose an action:
1 - Create ...
2 - Show ...
3 - Repeat ...
Q - Quit...

Если я наберу один из них, моя программа запустится, но, как уже упоминалось, она не будетперейти в заявлениях if.

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Рекурсивный вызов себя будет проблематичным, как упоминалось в других местах.Вот быстрый пример, который использует цикл While, чтобы сделать то, что (я интерпретировал как то), что вы намеревались сделать.Добавление дополнительных операторов записи поможет вам, а также научится использовать настоящий отладчик.

#include <iostream>
using namespace std;
int main(){

char input = '0';
cout << "This is the menu." << endl;

while(input != 'Q') {

    cout << "Choose an action:" << endl;
    cout << "1 - Create ..." << endl;
    cout << "2 - Show ..." << endl;
    cout << "3 - Repeat ..." << endl;
    cout << "Q - Quit..." << endl;

    cin >> input;

    cout << "You enetered: " <<input << endl;

    if(input == '1') {
        cout<< "use function1 here..." << endl;;
    }
    else if(input == '2'){
        cout<< "use function2 here..." << endl;;
    }
    else if(input == '3') {
        cout<< "use function3 here..." << endl;
    }
    else if(input == 'Q'){
    cout << "Leaving so soon?" << endl;
    }
    else{
        cout << "Its not a valid input.";
    }
}
return 0;
}
0 голосов
/ 18 октября 2018

Нет необходимости вызывать console рекурсивно.

В результате первый вызов консоли вызовет другой экземпляр.Теперь введенная вами команда обрабатывается вторым экземпляром, который вызывает другой экземпляр и так далее.Когда вы набираете Q, завершается только последний экземпляр, оставляя остальные активными и готовыми к вводу.

Почему бы вам не попробовать что-то вроде следующего?(обратите внимание, что здесь не используется рекурсия).

bool valid_input(const char c){
 return c=='1' || c=='2' || c=='3' || c=='Q';   
}
char input='0';


while(input != 'Q') {


   do{
     cout << "Choose an action:" << endl;
     cout << "1 - Create ..." << endl;
     cout << "2 - Show ..." << endl;
     cout << "3 - Repeat ..." << endl;
     cout << "Q - Quit..." << endl;
     cin >> input;
   }while(!valid_input(input));


    if(input == '1') {
        cout<<"use function1 here...\n";

    }
    if(input == '2'){
        cout<<"use function2 here...\n";

    }

    if(input == '3') {
       cout<< "use function3 here...\n";

    }
    if(input == 'Q'){
      cout<< "use functionQ here...\n";
    }

}

Попробуйте здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...