C: получение пользовательского ввода, сохранение, продолжение и отображение последних 50 входов - PullRequest
0 голосов
/ 21 марта 2012
#define HISTORY_SIZE 50
#define INPUT_SIZE 512   /*Max input size*/
char input[INPUT_SIZE];  /*Holding user input globaly*/
char* input_history[HISTORY_SIZE];

Вот как я сохраняю свой ввод для ввода и хочу сохранить его копию в input_history

 void addToHistory()
 {
/*input_history[currentHistorySize++] = strtok(input,"\n");*/
input_history[currentHistorySize++] = input;
printf("ADDEDTOHISTORY: %s \t\t %d \n", input_history[(currentHistorySize- 1)],currentHistorySize);

 }

Но когда я иду распечатать его, он не работает ....

/*strcpy(input,input_history[currentHistorySize-2]);
printf("LAST INPUT, %s \n %s \n \n", input,input_history[currentHistorySize-2]);*/

printf("0: %s \n ", input_history[0]);
printf("1: %s \n ", input_history[1]);
printf("2: %s \n ", input_history[2]);

Я сидел, пытаясь решить это целую вечность, и, кажется, не могу понять, где я ошибаюсь, может быть, пара новых глаз заметит какую-то глупую ошибку?

В основном я хочу получить пользовательский ввод, используя

fgets(input,INPUT_SIZE,stdin)

Затем сохраните его копию в char * input_history А потом сможете распечатать его позже.

Очень просто.

Ответы [ 5 ]

3 голосов
/ 21 марта 2012

Наиболее вероятная проблема заключается в том, что вы на самом деле не копируете строку, а просто копируете указатель (адрес строки).Попробуйте вместо этого:

input_history[currentHistorySize] = malloc(strlen(input) + 1);
strcpy(input_history[currentHistorySize], input);
currentHistorySize++;

Или, может быть:

input_history[currentHistorySize] = strdup(input);

Не забудьте также освободить их, когда закончите.

3 голосов
/ 21 марта 2012

Одна проблема определенно здесь:

input_history[currentHistorySize++] = input;

В конце концов вся ваша история будет ссылаться на одну и ту же область памяти, которая является input Создайте новый массив символов и скопируйте в него входные данные, а затем ссылку на новый массив.

1 голос
/ 21 марта 2012

Это присвоение указателя, а не строковая копия:

input_history[currentHistorySize++] = input;

, в результате чего все элементы в input_history указывают на input.

Вы можете использовать strdup() для копирования строки:

input_history[currentHistorySize++] = strdup(input);

или malloc() и strcpy(). Не забывайте free() элементы input_history, когда они больше не нужны.

1 голос
/ 21 марта 2012

Ваша переменная input_history представляет собой массив указателей, вы не можете просто назначить свой ввод следующим образом: input_history[currentHistorySize++] = input;

Читайте по указателям: http://en.wikipedia.org/wiki/Pointer_(computer_programming)

А затем продолжайте и используйте одну из стандартных функций библиотеки C, например, strndup(): http://linux.die.net/man/3/strdup

1 голос
/ 21 марта 2012

вместо

input_history[currentHistorySize++] = input;

использовать

sprintf(input_history[currentHistorySize++],"%s",input);

Предполагается, что input_history инициализирован.
Однако это не заботится о том, что размер input меньше или равен емкости input_history[x]. Вам решать, проверить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...