标签完成和部分完成

时间:2018-06-15 21:24:43

标签: c parsing console

我想创建一个程序,以类似于Linux上ip的方式接受命令。例如,我希望拥有show interface options的完整命令,但如果用户不与其他命令冲突,则可以只输入show in options或甚至只输入s i o

我有一些关于如何解决这个问题的想法,我想在C中这样做。所以问题是在Linux / UNIX系统之间保持尽可能可移植性的同时,这是一个很好的方法。

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

header.h

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()与其他两种方法相比有一些额外的开销。

目标平台是Raspberry Pi,它只有大约2GB的RAM可供使用。驱动器通常非常小,CPU可以,但不适合繁重的处理。我预计这些进程会受到命令处理的严重负担,因此我希望找到最小化RAM和CPU使用量的理想解决方案。我很想听到一些我不知道的方法! :)

2 个答案:

答案 0 :(得分:1)

我不知道这是否有用,但如果您不想重新发明轮子,请查看GNU readline,GNU / Linux中用于此类内容的库

答案 1 :(得分:1)

我认为trie(前缀树)数据结构是合适的,https://en.wikipedia.org/wiki/Trie;特别是,最小化内存量,人们可能更喜欢紧凑的前缀树,(基数树)。来自,https://en.wikipedia.org/wiki/Radix_tree

  

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

以下是一项实施,https://stackoverflow.com/a/31718868/2472827

相关问题