我正在攻读考试并需要你的帮助。 我必须用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) {
?????????????????????;
}
}
}
????? - 意味着我不知道该写什么。
帮助使该程序正常运行。 感谢。
答案 0 :(得分: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
参数,并在main()中使用char **argv
和int argc
。 argv
将是参数,argc
将是传递给函数的参数数量。例如如果你对节目说:
>> minus 5 1
然后argc
应该是2(5和1)和argv [0] =“5”和argv [1] =“1”。
既然您已了解其背后的想法,那么您可以实现更灵活的版本。
答案 1 :(得分: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_*()
应该按照自己的规则继续执行命令解析,即“plus”命令应该跟一个整数,一个空格然后是另一个整数,对吧? run_plus()
必须验证它,然后计算结果。 e.g:
//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()
代码修改,你得到了我的想法。我甚至不知道它是否会在C ++中针对不匹配类型进行编译。