2015-04-06 4 views
1

Я работаю над созданием простой оболочки в 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]; В каждой строке этой таблицы будет сохранена одна команда. Просмотр строк, расположенных по кругу, может быть построена структура данных , подобная очереди. В отличие от традиционной очереди ваша история никогда не будет переполняться - поскольку мы продолжаем добавлять команды, более старые команды просто перезаписывают .

ответ

3

Вашего commandHistory фактически два-dimensinal массива строк/символьные указатели, в то время как вы хотите одномерный один. Вы должны объявить его как это:

char *commandHistory[MAX_COMMANDS]; 

и вам не нужно беспокоиться о длине строки в этой точке, так как каждая команда выделяется динамически. А затем для доступа к 0-й строке из этого массива вам понадобится commandHistory[i], который имеет тип char *.

Update:
Если вы (или инструктор) настаивают на том, commandHistory объявлен как статический двумерный массив:

char commandHistory[MAX_COMMANDS][MAX_LINE_LENGTH + 1]; 

Вы не должны выделять буфер динамически, как вы это делаете, но копия команды в соответствующее место в вашем статически заданный массивcommandHistory (т.е. вместо buffer[position]=.. do commandHistory[i][position] = ...).

+0

Мне был выделен буфер динамически из-за этих инструкций для инструктора: Используйте динамическую память (например, malloc и realloc) для поддержки сколь угодно больших длин командных строк. Используйте динамическую память (например, malloc и realloc) для поддержки произвольно больших аргументов команды. Который я, очевидно, обрабатывал, прежде чем работал над историей –

+0

@connormoore Эти вещи не имеют смысла. Ну, это можно сделать, но это отходы. Если вы объявляете такой массив, вы уже охватили все необходимое пространство памяти (в худшем случае). –

+0

отсюда моя путаница .. для стартеров это мой первый класс с участием C (класс операционных систем). Инструкции для меня не имеют смысла. Из-за них у меня возникают проблемы. –

0

Вам необходимо либо сделать историю команд массивом символов char *, то есть: char * commandHistory [MAX_COMMANDS]; и скопируйте буферный указатель в запись истории (будьте осторожны: история теперь «владеет» разделенным пространством)

Альтернативой было бы сделать это двумерным массивом символов, но тогда вы не смогли бы принять ваше чрезмерное длинные команды (те, для которых вы перераспределили буфер).

Смежные вопросы