如何为我自己的 shell 的历史函数处理 100 的历史限制
How to handle history limit of 100 for my own shell's history function
这是我的问题:我正在构建自己的 shell 并实现了一个历史函数,唯一的问题是历史数组只能取 100 个值,最后 100 个值,这意味着当它发生时超过 100 第一个值被删除,每个值向后移动一个索引,最后一个值获得第 100 位。我唯一的问题是,无论我尝试什么,我的程序的其余部分都会开始出现错误(因此出现注释行)有什么方法可以使这项工作正常进行吗?
这是我的代码:
void hist_add(const char *cmd)
{
if(history_counter<100){
strcpy(history_array[history_counter].command_stored, cmd);
history_array[history_counter].command_number = 1111;
history_counter++;
}
// else {
// for(int j=0;j<100;j++){
// strcpy(history_array[j].command_stored, history_array[j+1].command_stored);
// }
// strcpy(history_array[history_counter].command_stored, cmd);
// history_array[history_counter].command_number = 1111;
// history_counter++;
// }
}
P.S:command_number 到目前为止每个命令都是 1111,因为我接下来要执行它。
- 将 100 元素数组的元素移动一位将有 99 步,而不是 100 步。最后 1 步被省略,因为它将一个元素移出数组。
- 班次正在删除一个元素。现在使用
history_counter
作为索引是错误的,因为计数应该根据下降而递减。
固定代码为:
else {
for(int j=0;j+1<100;j++){ /* use j+1<100, not j<100, to avoid out-of-range access */
strcpy(history_array[j].command_stored, history_array[j+1].command_stored);
}
history_counter--; /* decrement history_counter according to the drop */
strcpy(history_array[history_counter].command_stored, cmd);
history_array[history_counter].command_number = 1111;
history_counter++;
}
或者省略匹配的自减自增,可以这样写:
else {
for(int j=0;j+1<100;j++){ /* use j+1<100, not j<100, to avoid out-of-range access */
strcpy(history_array[j].command_stored, history_array[j+1].command_stored);
}
/* use history_counter-1 instead of history_counter */
strcpy(history_array[history_counter-1].command_stored, cmd);
history_array[history_counter-1].command_number = 1111;
}
j+1<100
可以写成j<100-1
。使用常量值(也许是宏)而不是幻数 100
将进一步改进您的代码。
这是我的问题:我正在构建自己的 shell 并实现了一个历史函数,唯一的问题是历史数组只能取 100 个值,最后 100 个值,这意味着当它发生时超过 100 第一个值被删除,每个值向后移动一个索引,最后一个值获得第 100 位。我唯一的问题是,无论我尝试什么,我的程序的其余部分都会开始出现错误(因此出现注释行)有什么方法可以使这项工作正常进行吗?
这是我的代码:
void hist_add(const char *cmd)
{
if(history_counter<100){
strcpy(history_array[history_counter].command_stored, cmd);
history_array[history_counter].command_number = 1111;
history_counter++;
}
// else {
// for(int j=0;j<100;j++){
// strcpy(history_array[j].command_stored, history_array[j+1].command_stored);
// }
// strcpy(history_array[history_counter].command_stored, cmd);
// history_array[history_counter].command_number = 1111;
// history_counter++;
// }
}
P.S:command_number 到目前为止每个命令都是 1111,因为我接下来要执行它。
- 将 100 元素数组的元素移动一位将有 99 步,而不是 100 步。最后 1 步被省略,因为它将一个元素移出数组。
- 班次正在删除一个元素。现在使用
history_counter
作为索引是错误的,因为计数应该根据下降而递减。
固定代码为:
else {
for(int j=0;j+1<100;j++){ /* use j+1<100, not j<100, to avoid out-of-range access */
strcpy(history_array[j].command_stored, history_array[j+1].command_stored);
}
history_counter--; /* decrement history_counter according to the drop */
strcpy(history_array[history_counter].command_stored, cmd);
history_array[history_counter].command_number = 1111;
history_counter++;
}
或者省略匹配的自减自增,可以这样写:
else {
for(int j=0;j+1<100;j++){ /* use j+1<100, not j<100, to avoid out-of-range access */
strcpy(history_array[j].command_stored, history_array[j+1].command_stored);
}
/* use history_counter-1 instead of history_counter */
strcpy(history_array[history_counter-1].command_stored, cmd);
history_array[history_counter-1].command_number = 1111;
}
j+1<100
可以写成j<100-1
。使用常量值(也许是宏)而不是幻数 100
将进一步改进您的代码。