对于类,我使用C++创建了一个shell。从C++开始工作已经有一段时间了,所以我遇到了一些麻烦。该项目的一个要求是我必须使用read()系统调用。无法将内存分配给C++中的唯一地址
我需要保持一个命令历史记录(类似于bash的,如果你按向上箭头),其存储最近20个命令。我觉得做到这一点的最好方法是使用指向先前语句的指针数组。我遇到了一个问题,无论我做什么,包含用户输入的字符串总是存储在内存中的相同位置。为了澄清,这意味着,如果用户输入5条语句,然后查看他/她的历史记录,他们将看到最近的语句5次。我的代码看起来有点像这样(我不得不削减一些东西出来,因为在中间有很多的错误处理):
char *history[20];
int historyCounter = 0;
while(true){
char currLine[65];
int charsRead = read(0,currLine,65);
char tmp[charsRead];
strcpy(tmp,currLine); //This is my attempt to ensure the char[] is stored int a
//unique location every time, but this attempt failed.
history[historycounter] = tmp;
historycounter++;
}
只是要注意,在我的源代码,我做处理时的情况historycounter> 19.只是不在这个片段。
如果需要任何更多的澄清,我很乐意提供。这是我第一次在堆栈溢出发帖,所以如果我犯了新手的任何错误,我都会提前道歉。如果解决方案很痛苦,我也很抱歉。我一直在看这一段时间,而我完全有可能没有直截了当。
不要使用'这里strcpy' - 'read'不空终止其输出等'charsRead'不包括终止空字符的空间,也没有任何终止空字符存在。您应该使用memcpy(并明确记录长度)或添加终止字符(并确保在复制时为其分配空间)。 – bdonlan 2011-12-31 21:07:20