Tab Completion and Partial Completion
我想做一个程序,它以类似于 Linux 上的
我对如何解决这个问题有一些想法,我想在 C 中执行此操作。所以问题是什么是解决此问题的好方法,同时在 Linux/UNIX 系统之间保持尽可能可移植性。
我的第一个想法是有一个链表。每个列表项指向字符串数组中的下一个命令,最后一个命令具有函数调用的地址(请原谅我草率的伪代码)。
header.h
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 使用量。我很想听听一些我不知道的方法! :)
我认为 trie(前缀树)数据结构是合适的,https://en.wikipedia.org/wiki/Trie;具体来说,最小化内存量,人们可能更喜欢紧凑的前缀树,(基数树)。来自,https://en.wikipedia.org/wiki/Radix_tree:
In a trie, all comparisons require constant time, but it takes m comparisons to look up a string of length m. Radix trees can perform these operations with fewer comparisons, and require many fewer nodes.
这是一个实现,https://stackoverflow.com/a/31718868/2472827。
我不知道这是否有用,但如果您不想重新发明轮子,请查看 GNU readline,这是 GNU/Linux 中用于此类东西的库。