【发布时间】:2011-12-31 20:37:57
【问题描述】:
对于课程,我正在用 C++ 创建一个 shell。自从我使用 C++ 以来已经有一段时间了,所以我遇到了一些麻烦。该项目的要求之一是我必须使用 read() 系统调用。
我需要保留存储最近 20 条命令的命令历史记录(类似于 bash,如果您按向上箭头)。我觉得最好的方法是使用指向先前语句的指针数组。我遇到了一个问题,无论我做什么,包含用户输入的字符串总是存储在内存中的相同位置。澄清一下,这意味着,如果用户输入 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 的情况。只是不在这个 sn-p 中。
如果需要进一步说明,我很乐意提供。这是我第一次在堆栈溢出上发帖,所以如果我犯了任何新手错误,我提前道歉。如果解决方案非常明显,我也深表歉意。我已经研究了一段时间,完全有可能我只是想不直。
【问题讨论】:
-
不要在此处使用
strcpy-read不会以空值终止其输出,因此charsRead不包含用于终止空字符的空格,也不存在任何终止空字符。您应该使用 memcpy(并明确跟踪长度)或添加终止字符(并确保在复制时为其分配空间)。
标签: c++ arrays memory pointers