gpt4 book ai didi

c - Readline.H 在 C 中的历史用法

转载 作者:太空狗 更新时间:2023-10-29 16:10:52 30 4
gpt4 key购买 nike

我正在尝试将最后一个命令写入我的 C 程序中。现在它只是接受一个命令并将其添加到历史记录中。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<readline/readline.h>
#include<readline/history.h>

int main(int argc, char **argv){
char *s;
char *p = getenv("USER");
char *host =getenv("HOSTNAME");
int count = 1;
char *ps;
sprintf(ps, "%d %s@%s:", count, p, host);


while (s=readline(ps)){
add_history(s);
free(s);
count++;
sprintf(ps, "%d %s@%s:", count, p, host);
}
return 0;
}

我从位于此处的手册中看到 https://cnswww.cns.cwru.edu/php/chet/readline/history.html我无法在不使用函数的情况下从历史中获取信息:

HIST_ENTRY * history_get (int offset)

有没有人有readline历史的例子?我很难理解这个概念。

谢谢

最佳答案

继续评论,您的主要问题是您只提供了一个未初始化的指针,没有为ps 分配内存。虽然您可以自由地动态分配 ps,但只需使用自动存储就足够了,例如:

char ps[MAXC] = "";  /* where MAXC is a constant of sufficient size */

除了获取单个条目外,readline 和历史库还提供检索 session 的整个历史列表的能力。例如,要检索历史 session ,history_list () 将返回类型为 HIST_ENTRY ** 的已分配数组,其中包含 session 的历史记录。其使用的一个简短示例是:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<readline/readline.h>
#include<readline/history.h>

enum { MAXC = 128 };

int main (void){

char ps[MAXC] = "",
*p = getenv("USER"),
*host = getenv("HOSTNAME"),
*s = NULL;
int count = 1;
sprintf(ps, "%d %s@%s> ", count, p, host);

using_history(); /* initialize history */

while ((s = readline(ps))) {
if (strcmp (s, "quit") == 0) {
free (s);
break;
}
add_history (s);
free (s);
count++;
sprintf (ps, "%d %s@%s> ", count, p, host);
}

/* get the state of your history list (offset, length, size) */
HISTORY_STATE *myhist = history_get_history_state ();

/* retrieve the history list */
HIST_ENTRY **mylist = history_list ();

printf ("\nsession history for %s@%s\n\n", p, host);
for (int i = 0; i < myhist->length; i++) { /* output history list */
printf (" %8s %s\n", mylist[i]->line, mylist[i]->timestamp);
free_history_entry (mylist[i]); /* free allocated entries */
}
putchar ('\n');

free (myhist); /* free HIST_ENTRY list */
free (mylist); /* free HISTORY_STATE */

return 0;
}

示例使用/输出

$ ./bin/readline
1 david@alchemy> command 1
2 david@alchemy> command 2
3 david@alchemy> command 3
4 david@alchemy> quit

session history for david@alchemy

command 1
command 2
command 3

检查一下,如果您有任何其他问题,请告诉我。

关于c - Readline.H 在 C 中的历史用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38792542/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com