c - 将 GNU readline 提示设置为 NULL 会导致自定义提示被覆盖

标签 c readline

我正在用 c 编写自定义 shell,遇到了一个奇怪的小错误,可以在以下测试用例中看到:

#include <stdio.h>
#include <stdbool.h>

#include <readline/readline.h>
#include <readline/history.h>

int main(int argc, char **argv, char **env) {
  while(true) {
    fprintf(stdout, "input: ");
    char *line = readline(NULL);

    if(line) {
      add_history(line);
    }
  }
  return 0;
}

程序吐出提示,如果我输入如下内容:

input: foo bar baz

然后去删除行,输入:也被删除(一旦我点击了我输入的第一个字符)。有没有什么办法解决这一问题?我唯一能想到的就是 fflush(stdout) 但那没有用。

最佳答案

将提示告诉readline():

#include <readline/readline.h>
#include <readline/history.h>

int main(void)
{
    char *line;
    while ((line = readline("input: ")) != 0)
        add_history(line);
    return 0;
}

当您自己进行提示时,readline() 不知道提示的存在,因此在您删除输入的最后一个字符(将光标移回到行首)。当它知道提示时,它不会删除它。

关于c - 将 GNU readline 提示设置为 NULL 会导致自定义提示被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30409122/

相关文章:

mysql - mysql 客户端中的命令历史记录仅显示多行查询的最后一行

java - 使用 line.contains() 查找与特定关键字数组匹配的特定行

python - 如何实现能够很好​​地处理异步输出的 python REPL?

c - 使用 sscanf 迭代地解析字符串输入

c - 如何从文件 C 初始化结构体?

c# - 一种压缩多个阅读线的方法?

android - 从 adb shell 使用 sqlite3 时光标键不起作用

c - 如何将控制台输出写入文本文件

c - 加入4副牌

c - 从c中的套接字读取所有字节