C:获取用户输入,存储,继续显示最后50个输入

时间:2012-03-21 11:34:43

标签: c string io copy

#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 个答案:

答案 0 :(得分:3)

一个问题肯定在这里:

input_history[currentHistorySize++] = input;

最终您的所有历史记录都将引用相同的内存位置,即input 创建一个新的char数组并将输入复制到其中,然后引用新数组。

答案 1 :(得分:3)

最可能的问题是你实际上没有复制字符串,你只是复制指针(字符串的地址)。试试这个:

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

或者也许:

input_history[currentHistorySize] = strdup(input);

你应该记得在完成后释放它们。

答案 2 :(得分:1)

而不是

input_history[currentHistorySize++] = input;

使用

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

假设input_history已初始化 但是,这并不需要考虑input的大小是否小于或等于input_history[x]的容量。由你来检查。

答案 3 :(得分:1)

您的input_history变量是一个指针数组,您不能像这样分配输入:input_history[currentHistorySize++] = input;

阅读指针:http://en.wikipedia.org/wiki/Pointer_(computer_programming

然后继续使用C标准库函数之一,例如strndup()http://linux.die.net/man/3/strdup

答案 4 :(得分:1)

这是指针赋值,而不是字符串副本:

input_history[currentHistorySize++] = input;

导致input_history中的所有元素都指向input

您可以使用strdup()复制字符串:

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

malloc()strcpy()。 <!1}}当不再需要时,请记住free()的元素。