Я пытался запрограммировать командную строку оболочки в стиле UNIX на C. В этой программе мне нужно отслеживать команды, которые уже были использованы, чтобы пользователь мог вызвать последнюю команду, введя «r». Я сделал глобально инициализированный массив для хранения строк. Всякий раз, когда необходимо сохранить массив символов, введенный пользователем, я добавляю его в глобальный массив. Я пробовал memcpy, просто копируя каждое значение, используя цикл, и просто копируя указатель. Ни один из них не работал. Я не очень знаком с C, и я уверен, что это проблема указателя.
Всякий раз, когда я копирую указатель inputBuffer в строку глобального массива (она копируется), однако после выхода из функции настройки этот указатель исчезает? Я не совсем уверен, что я делаю неправильно.
Тест:
(1) пользовательский ввод -> ls
string [0] = ls
(2) пользовательский ввод -> r
inputBuffer = ls
строка [недавний] = ls
неправильно делает ...
inputBuffer = r
строка [недавний] = г
(я включил соответствующие части кода.)
#define MAX_LINE 80 /* 80 chars per line, per command, should be enough. */
#define SAVED_BUFFER 100
char *string[SAVED_BUFFER];
int p = 0;
int recent = -1;
int stringSize = 0;
void setup(char inputBuffer[], char *args[],int *background)
{
int length, /* # of characters in the command line *
/* read what the user enters on the command line */
length = read(STDIN_FILENO, inputBuffer, MAX_LINE);
start = -1;
if (length == 0)
exit(0); /* ^d was entered, end of user command stream */
if (length < 0){
perror("error reading the command");
exit(-1); /* terminate with error code of -1 */
}
if (inputBuffer[0] == 'r' && inputBuffer[1] == '\n' && stringSize > 0) {
int k;
memcpy(inputBuffer, string[recent], strlen(string[recent]) + 1);
printf("%s",inputBuffer);
printf("%s",string[recent]);
}
else {
string[p] = inputBuffer;
printf("%s", string[0]);
stringSize++;
recent++; // one behind strings current array location, to get history
p++; // current string array spot
}
}
int main(void)
{
char inputBuffer[MAX_LINE]; /* buffer to hold the command entered */
int background; /* equals 1 if a command is followed by '&' */
char *args[MAX_LINE/2+1];/* command line (of 80) has max of 40 arguments */
while (1) { /* Program terminates normally inside setup */
background = 0;
printf("COMMAND2->");
fflush(0);
setup(inputBuffer, args, &background); /* get next command */
}
}