在C中更新多维数组

时间:2015-04-07 03:12:13

标签: c arrays shell multidimensional-array

我在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个记忆之一)。

我需要帮助,因为我不确定如何解决这个问题。感谢

2 个答案:

答案 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*/;