【问题标题】:Updating multi-dimensional array in C在 C 中更新多维数组
【发布时间】:2015-06-11 13:09:22
【问题描述】:

我在 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 并执行该命令(如果给定的命令是仍然记得的 10 个命令之一)。

我需要帮助,因为我不知道如何解决这个问题。谢谢

【问题讨论】:

  • commandHistory,按照定义,创建一个指向字符的二维指针数组(嗯,从技术上讲,它做了其他事情,但从社会上讲,这就是它的作用)。我假设 MAX_LENGTH 是行的长度,并且您想存储 MAX_COMMANDS 行。因此,您不应将char*s 存储在这些元素中,而应将chars 存储在这些元素中。如果您正在进行动态分配,您将删除第二个数组并保留 char*s。

标签: c arrays shell multidimensional-array


【解决方案1】:

我个人会使用指针数组并跟踪动态内存。减少内存使用,让物品从末端掉落更直接。

显然未经测试,我没有仔细研究这一点以确保我没有因一个错误或其他原因而关闭,但一般概念应该很清楚。

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]);
}

【讨论】:

    【解决方案2】:

    如果命令总是有一个关联的数字,那么(对我来说)最自然的表示是结构。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 2016-02-26
      • 1970-01-01
      相关资源
      最近更新 更多