#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中 然后能够在以后打印出来。
很简单。
答案 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()
的元素。