如何用C ++编写Console终端

时间:2013-11-23 17:19:11

标签: c++ c visual-studio visual-c++

我正在攻读考试并需要你的帮助。 我必须用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) {
            ?????????????????????;
        }
    }

}

????? - 意味着我不知道该写什么。

帮助使该程序正常运行。 感谢。

2 个答案:

答案 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 **argvint argcargv将是参数,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 ++中针对不匹配类型进行编译。