我在C中定义了以下内容:
#define MAX_COMMANDS 10;
char * commandHistory[MAX_COMMANDS][MAX_LENGTH + 1];
这个想法是跟踪在我的自定义shell上输入的最后10个命令。我只想跟踪最近的10个命令。每个命令都需要与一个数字1,2,3,4等相关联,因此我以后可以使用!83(例如)重新执行第83个输入的命令。
所以,我很好,直到我的命令历史记录如下:
commandHistory = [cmd0, cmd1, cmd2, ... , cmd9]
我还有一个我用来索引的变量,i,当输入下一个命令时它将是10
此时我完全没事。在shell上输入下一个cmd时该怎么办。我需要commandHistory看起来像这样:
commandHistory = [cmd1, cmd2, cmd3, ... , cmd10]
但我还需要能够打印他们的命令+数字,所以第10个输入的命令将打印为10 cmd10。我还需要能够稍后调用!来自我的shell并执行该命令(如果给定的命令仍然是10个记忆之一)。
我需要帮助,因为我不确定如何解决这个问题。感谢
答案 0 :(得分:0)
我个人会使用一个指针数组并跟踪动态内存。减少内存使用并使项目更加简单易用。
显然没有经过测试,我没有仔细研究过这一点,以确保我没有一个错误或其他错误,但一般概念应该非常明确。
char commandHistory[MAX_COMMANDS][MAX_LENGTH+1];
int histSize = 0;
int histBase = 0;
void addHistory(const char *cmd)
{
if (++histSize >= MAX_COMMANDS)
{
for(int x=1;x<MAX_COMMANDS;x++)
memcpy(commandHistory[x-1],commandHistory[x],(MAX_LENGTH+1));
histSize--;
histBase++;
}
memcpy(commandHistory[histSize],cmd,MIN(strlen(cmd),MAX_LENGTH));
}
char *gethistory(int num)
{
int offset = num - histBase;
if (offset < 0 || offset > histSize)
return(NULL);
return(commandHistory[offset]);
}
答案 1 :(得分:0)
如果命令总是有一个关联的数字,那么对我来说最自然的表示就是结构。
struct {
int num;
char *cmd;
};
然后可以选择如何表示这些序列。你可以制作一个链表。
struct cmd {
int num;
char *cmd;
struct cmd *next;
} *head = NULL;
或数组。
struct {
int num;
char *cmd;
} cmdhist[MAX_CMD_HIST];
填满后,您可以循环回同一个数组并再次从0更新到MAX。现在,您可以使用其命令字符串跟踪关联的数字。
当然,如果你真的想要修复数组,所有char *cmd;
行都可以是char cmd[MAX_CMD_LENGTH]
。它们可以很好地包含在结构中。
for (int i=0; i<MAX_CMD_HIST; i++)
if (cmdnum == cmdhist[i].num)
return /*execute cmdhist[i].cmd*/;
return /*not found*/;