我一直致力于在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 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(空):
int lsh_history(char **args)
{
int i;
for (i = 0; i < MAX_COMMANDS; i++) {
printf(" %s\n", commandHistory[i][0]);
}
}
编辑:我需要使用二维数组。这是建造一个外壳的最后一部分,我有麻烦了。虽然我相信这可以通过一维数组来实现,但我遵循这部分说明:
在内部,shell应将命令历史记录保存在二维数组中:
char commandHistory[最大行数命令][最大行数长度+1];
此表的每一行将存储一个命令。查看圆形排列的行,数据
可以构造类似于队列的结构。与传统队列不同,您的命令
历史永远不会溢出-当我们继续添加命令时,旧的命令只会
被覆盖。
最佳答案
你的commandHistory
实际上是一个由字符串/字符指针组成的二维数组,而你需要一个一维数组。你应该这样声明:
char *commandHistory[MAX_COMMANDS];
现在不必担心字符串的长度,因为每个命令都是动态分配的。然后要访问这个数组中的第
i
个字符串,只需要commandHistory[i]
,它的类型是char *
。更新:
如果您(或讲师)坚持将
commandHistory
声明为静态二维数组: char commandHistory[MAX_COMMANDS][MAX_LINE_LENGTH + 1];
您不应该像这样动态地分配缓冲区,而是将命令复制到静态预分配数组的相应位置(即,代替
commandHistory
dobuffer[position]=..
)。