在C语言的交互式cli程序中,一般如何扫描parse命令,有标准的方法吗?

问题描述 投票:0回答:1

我在用 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程序有没有通用的写法?

我可以写代码来解析命令,只是想知道这种情况的标准方法?

c command-line-interface scanf
1个回答
0
投票

其实并没有一个标准的方法来做。这不是一个100%公平的比较,但你的问题有点像是否有一个标准的方法来构造一个编译器,因为你实际上是在构造一种语言,虽然是一个非常简单的语言。

但是有一种合理常见的方法,对于简单的程序来说,效果相当好,就是这种方法。假设我们有两个命令 adddel. 为这两个命令创建一个函数。首先我们搜索其中一个字符串 "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)
© www.soinside.com 2019 - 2024. All rights reserved.