我在用 c
.
一些命令的例子(以 >
)我想处理的是。
$ ./my_program // run the program
> add user
id: 123 // this is the output of above command
> update user 123 name "somename"
> remove user 123
> quit
所以基本上命令是一行多行的字符串。
这是我试图处理命令的方式。
int
指挥部的唯一值#include <stdio.h>
int parse_cmd(const char *buffer)
{
// parse command
}
int main(int argc, const char **argv)
{
// init code
char buffer[100];
int cmd;
while (1) {
printf("> ");
scanf("%[^\n]%*c", buffer);
cmd = parse_cmd(buffer);
if (cmd < 0) {
printf("error: invalid command\n");
continue;
}
switch (cmd) {
// handle commands
}
}
// deinit code
}
我见过很多cli程序都是用类似的方式来接受命令输入的,不知道cli程序有没有通用的写法?
我可以写代码来解析命令,只是想知道这种情况的标准方法?
其实并没有一个标准的方法来做。这不是一个100%公平的比较,但你的问题有点像是否有一个标准的方法来构造一个编译器,因为你实际上是在构造一种语言,虽然是一个非常简单的语言。
但是有一种合理常见的方法,对于简单的程序来说,效果相当好,就是这种方法。假设我们有两个命令 add
和 del
. 为这两个命令创建一个函数。首先我们搜索其中一个字符串 "add "
或 "del "
. 注意这些空格。在下一个字符上放一个指针,然后调用相应的函数,剩下的行作为参数,让他们来决定事情。
下面是一些伪。
parse(bufferptr)
word = getFirstWord(bufferptr)
ptr = bufferptr + strlen(word)
if word == "add"
return add(ptr)
else if word == "del"
return del(ptr)
return -1
add(bufferptr)
word = getFirstWord(bufferptr)
if userExist(word)
return -1
else
return addUser(word)
del(bufferptr)
word = getFirstWord(bufferptr)
if not userExist(word)
return -1
else
return delUser(word)
buffer = input()
int res = parse(buffer)