将值添加到char * [] []

时间:2015-04-06 20:09:15

标签: c arrays pointers multidimensional-array

我一直在使用C语言构建一个简单的shell。我想添加一个内置函数的历史记录,但我需要知道如何执行以下操作:

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

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

在我的读取行函数中,我想将第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 error\n");
    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] = '\0';
      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 error\n");
        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(null):

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

编辑:我需要使用二维数组。这是构建我遇到问题的shell的最后一部分。虽然我相信这可以通过一维数组完成,但我遵循这部分说明:

  

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

2 个答案:

答案 0 :(得分:3)

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

char *commandHistory[MAX_COMMANDS];

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

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

 char commandHistory[MAX_COMMANDS][MAX_LINE_LENGTH + 1];

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

答案 1 :(得分:0)

您需要使命令历史记录成为char *的数组,即: char * commandHistory [MAX_COMMANDS]; 并将缓冲区指针复制到历史记录条目中(注意;历史记录现在“拥有”malloced空间)

另一种方法是使它成为一个二维chars数组,但是你不能接受你过长的命令(你重新分配缓冲区的命令)。