代码之家  ›  专栏  ›  技术社区  ›  Katya Veselnitskaya

制表符完成和部分完成

  •  0
  • Katya Veselnitskaya  · 技术社区  · 6 年前

    我想做一个程序,它接受命令的方式类似于 ip 在Linux上。例如,我想完全掌握 show interface options 但是用户可以输入 show in options 甚至只是 s i o 如果他们不与其他命令冲突。

    我对如何实现这一点有一些想法,我想用C语言来实现。所以问题是,在Linux/Unix系统之间尽可能保持可移植性的同时,什么是实现这一点的好方法。

    我的第一个想法是有一个链表。每个列表项指向字符串数组中的下一个命令,最后一个命令具有函数调用的地址(请原谅我草率的伪代码)。

    标题

    typedef int8_t (__cdecl *proc_stub)(void *data, uint16_t len);
    typedef struct s_proc_stub
    {
        char command[16];
        proc_stub proc;
        struct s_proc_stub *next;
    };
    struct s_proc_stub proc_list[] =
    {
        { "cmd", CommandFunction, ... },
        { "set", SetFunction, ... },
        ...
    };
    

    我觉得这其中的一个缺点可能是额外的CPU和RAM利用率。它也可能容易出错,从而导致漏洞。这个过程将面向互联网,所以我想确保代码的安全性。

    我的下一个想法是使用strtok()并对每个令牌执行strnicmp()。另一种方法是使用指针算法更快地模拟strtok(),而不修改缓冲区。我觉得strtok是最直截了当的方法,也是最不容易出错的方法,但我想说的是,与其他两种方法相比,strtok()有一些额外的开销。

    它的目标平台是一个树莓pi,它只有大约2gb的ram可供使用。这些驱动器通常都很小,CPU还可以,但对于繁重的处理来说并不理想。我预计这些进程将在命令处理的重载下运行,因此我希望得到一个理想的解决方案,可以最大限度地减少ram和cpu的使用量。我很想听一些我不知道的方法!:)

    2 回复  |  直到 6 年前
        1
  •  1
  •   Neil    6 年前

    我认为trie(前缀树)数据结构是合适的, https://en.wikipedia.org/wiki/Trie ;具体地说,最小化内存量,可以选择紧凑的前缀树(基数树)。 https://en.wikipedia.org/wiki/Radix_tree :

    在trie中,所有比较都需要恒定的时间,但查找长度为m的字符串需要m个比较。基数树可以用较少的比较执行这些操作,并且需要较少的节点。

    这是一个实现, https://stackoverflow.com/a/31718868/2472827 .

        2
  •  1
  •   Guilherme Borges    6 年前

    我不知道这是否有用,但如果你不想重新发明轮子,看看 GNU readline ,在gnu/linux中用于此类内容的库。