c-向char*[][]添加值



我一直在努力在C中构建一个简单的shell。我想添加一个历史内置函数,但我需要知道如何做到以下几点:

我有一个全局变量commanHistory,我相信它是一个指向字符数组的指针?(如果我错了,请纠正我)。

char *commandHistory[MAX_COMMANDS][MAX_LINE_LENGTH + 1];

在read line函数中,我想将第I行存储在commandHistory的第I行中。以下是我正在做的事情:

char *lsh_read_line(void)
{
  int bufsize = MAX_LINE_LENGTH;
  int position = 0;
  char *buffer = malloc(sizeof(char) * bufsize);
  int c;
  int i = 0;
  if (!buffer) {
    fprintf(stderr, "lsh: allocation errorn");
    exit(EXIT_FAILURE);
  }
  while (1) {
    // Read a character
    c = getchar();
    // If we hit EOF, replace it with a null character and return.
    if (c == EOF || c == 'n') {
      buffer[position] = '';
      return buffer;
    } else {
      buffer[position] = c;
    }
    position++;
   // If we have exceeded the buffer, reallocate.
    if (position >= bufsize) {
      bufsize += MAX_LINE_LENGTH;
      buffer = realloc(buffer, bufsize);
      if (!buffer) {
        fprintf(stderr, "lsh: allocation errorn");
        exit(EXIT_FAILURE);
      }
    }
  }
commandHistory[i++][0] = buffer; // wanting to store command i in commandHistory (also only want to keep track of 10 at a time)
}

当我调用我的内置函数时,我只得到10(空)打印出来:

int lsh_history(char **args)
{
  int i;
  for (i = 0; i < MAX_COMMANDS; i++) {
    printf("  %sn", commandHistory[i][0]);
  }
}

编辑:我需要使用2d数组。这是建造一个我遇到麻烦的外壳的最后一部分。虽然我相信这可以用一维阵列来完成,但我遵循以下部分说明:

在内部,shell应该将命令历史记录保存在二维数组中:char命令历史[MAX_COMMANDS][MAX_LINE_LENGTH+1];该表的每一行都将存储一个命令。查看排列成圆形的行,数据可以构造类似于队列的结构。与传统队列不同,您的命令历史永远不会溢出——当我们继续添加命令时,旧的命令只会被覆盖。

您的commandHistory实际上是字符串/字符指针的二维数组,而您想要的是一维数组。你应该这样声明:

char *commandHistory[MAX_COMMANDS];

此时您不需要担心字符串长度,因为每个命令都是动态分配的。然后,要访问该数组中的第i'个字符串,您只需要commandHistory[i],它的类型为char *

更新:
如果您(或讲师)坚持将commandHistory声明为静态二维数组:

 char commandHistory[MAX_COMMANDS][MAX_LINE_LENGTH + 1];

您不应该像这样动态分配缓冲区,而是将命令复制到静态预分配的数组commandHistory中的相应位置(即代替buffer[position]=..执行commandHistory[i][position] = ...)。

您需要将命令历史记录设置为char*数组,即:char*命令历史[MAX_COMMANDS];并将缓冲区指针复制到历史条目中(小心;历史现在"拥有"mallocated空间)

另一种选择是让它成为一个2D字符数组,但你不能接受过长的命令(那些你重新定位缓冲区的命令)。

最新更新