Я изучаю экзамен и нуждаюсь в вашей помощи. Я должен написать собственный консольный терминал в 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) {
?????????????????????;
}
}
}
????? - значит, я не знаю, что писать.
Помогите, чтобы эта программа работала. Благодарю.
Я буду использовать минус-операцию в качестве примера...
Сделайте такую структуру:
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".
Теперь, когда вы знаете идею этого, вам предоставляется более гибкая версия.
Вызовите соответствующую функцию для обработки каждого слова. Например:
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++ для типов рассогласования.