Я работаю над созданием простой оболочки в C. Я хочу добавить встроенную функцию истории, но мне нужно знать, как сделать следующее:Добавление значений в char * [] []
У меня есть глобальная переменная commanHistory, которая, я считаю, является указателем на массив символов? (исправьте меня, если я ошибаюсь).
char *commandHistory[MAX_COMMANDS][MAX_LINE_LENGTH + 1];
В моей функции чтения строки, я хочу, чтобы сохранить ю строку в -й строке commandHistory. Вот что я делаю:
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]);
}
}
EDIT: Я должен использовать 2d. Это последняя часть создания оболочки, с которой у меня возникают проблемы. Хотя я считаю, что это может быть сделано с 1 одномерным массивом, я после этой части инструкций:
Внутри ваша оболочка должны сохранять историю команд в 2-мерном массиве: символа commandHistory [MAX_COMMANDS] [ MAX_LINE_LENGTH + 1]; В каждой строке этой таблицы будет сохранена одна команда. Просмотр строк, расположенных по кругу, может быть построена структура данных , подобная очереди. В отличие от традиционной очереди ваша история никогда не будет переполняться - поскольку мы продолжаем добавлять команды, более старые команды просто перезаписывают .
Мне был выделен буфер динамически из-за этих инструкций для инструктора: Используйте динамическую память (например, malloc и realloc) для поддержки сколь угодно больших длин командных строк. Используйте динамическую память (например, malloc и realloc) для поддержки произвольно больших аргументов команды. Который я, очевидно, обрабатывал, прежде чем работал над историей –
@connormoore Эти вещи не имеют смысла. Ну, это можно сделать, но это отходы. Если вы объявляете такой массив, вы уже охватили все необходимое пространство памяти (в худшем случае). –
отсюда моя путаница .. для стартеров это мой первый класс с участием C (класс операционных систем). Инструкции для меня не имеют смысла. Из-за них у меня возникают проблемы. –