Как написать консольный терминал на C ++

0

Я изучаю экзамен и нуждаюсь в вашей помощи. Я должен написать собственный консольный терминал в C++, который должен работать следующим образом:

Пример:

:> plus 5 7 "hit ENTER"
:> 12
:> minus 10 12 "hit ENTER"
:> -2
:> combine Hello World "hit ENTER"
:> HelloWorld
:> run netstat "hit ENTER"
:> runs netstat
:> help
:> plus int1 int2
minus int1 int2
combine string1 string2
run?????
:> exit
program exits

Для основного блока я думаю, что это будет что-то вроде этого

int main(void) {
    string x;
    while (true) {
        getline(cin, x);
        detect_command(x);
    }
    return 0;
}

Функции будут такими, как это

void my_plus(int a, int b) {
    cout << a + b;
}
void my_minus(int a, int b) {
    cout << a - b;
}
void my_combine(string a, string b) {
    ?????????????;
}
void my_run(?????????) {
    ???????????;
}

И команда detect_command

void detect_command(string a) {
    const int arr_length = 10;
    string commands[arr_length] = { "plus", "minus", "help", "exit" };
    for (int i = 0; i < arr_length; i++) {
        if (a.compare(0, commands[i].length(), commands[i]) == 0) {
            ?????????????????????;
        }
    }

}

????? - значит, я не знаю, что писать.

Помогите, чтобы эта программа работала. Благодарю.

Теги:
visual-studio
visual-c++

2 ответа

0
Лучший ответ

Я буду использовать минус-операцию в качестве примера...

Сделайте такую структуру:

struct cmd_struct {
   const char *name;
   void (*func) (void *data);
};

Поскольку параметры вашей функции не совпадают, вы должны создать struct для каждого, например:

struct minus_op {
   int rhs;
   int lhs;
};

И используйте cmd_struct как массив, например:

static cmd_struct commands[] = {
   { "minus", &my_minus },
    ...
};

Тогда my_minus будет:

void my_minus(void *data) {
    struct minus_op *mop = data;
     ... do the computation and return ...
}

И прокрутите его, чтобы обнаружить используемую команду:

for (int i = 0; i < sizeof(commands) / sizeof(commands[0]); ++i) {
   if (strcmp(commands[i].name, a) == 0) {
        ... prepare the data ...
        commands[i].func(data);
    }
}

Сторона Примечание. Чтобы получить параметры функции из командной строки, используйте сплиттер, например, пробел. Используйте вектор для этого и передайте этот вектор в detect_command

Также обратите внимание: избавиться от параметра void используемого в этом примере, и использовать char **argv и int argc как в main(). argv будет аргументом, а argc будет числом аргументов, переданных функции. например, если вы скажете программе:

>> minus 5 1

Тогда argc должен быть 2 (5 и 1) и argv [0] = "5" и argv [1] = "1".

Теперь, когда вы знаете идею этого, вам предоставляется более гибкая версия.

  • 0
    Спасибо, я понял. Я наконец-то работает. codeo.me/2rN
  • 0
    затем смело отмечайте ответ, который вам больше всего помог, как правильный.
0

Вызовите соответствующую функцию для обработки каждого слова. Например:

enum commands {
  PLUS,
  MINUS,
  HELP,
  EXIT
  //....
};

int detect_command(string a) {
    const int arr_length = 10;
    string commands[arr_length] = { "plus", "minus", "help", "exit" };
    for (int i = 0; i < arr_length; i++) {
        if (a.compare(0, commands[i].length(), commands[i]) == 0)
         return i;    
    }
    return -1; //unknow word
}

Дайте строке функции detect_command() чтобы возвращать соответствующее целое число в enum commands (значение нашего i) или -1, если слово неизвестно. Затем вы можете написать такую функцию, чтобы использовать и обрабатывать значение, определенное detect_command():

void run_command(int cmd)
{
   switch(cmd) {
    case PLUS: run_plus(); break;
    case MINUS: run_minus(); break;
    // and so on to all comamnds available
   default: error("unknow command");
   }
}

каждая функция run_*() должна продолжать синтаксический анализ команды в соответствии с собственными правилами, т.е. команде "плюс" следует следовать одно целое, одно белое пространство и другое целое число, верно? run_plus() должен проверить его, а затем вычислить результат. например:

//pseudo code
void run_plus()
{
   //input here is one after "plus" word
   //here we must validate our valid input: two digits split by a white-spaces
  int x = parse_digit();
  check(white-space);
  int y = parse_digit();
  int r = x + y;
  display_result(r);
}

ПРИМЕЧАНИЕ. Я не программист C++; Я сделал detect_command() чтобы вы detect_command() мою идею. Я даже не знаю, будет ли он компилироваться в C++ для типов рассогласования.

  • 0
    Спасибо за идею. Я наконец-то работает. codeo.me/2rN
  • 0
    @grigorkh: Пожалуйста. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню