如何为我自己的 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 将进一步改进您的代码。