【问题标题】:readline() function issues with printfprintf 的 readline() 函数问题
【发布时间】:2021-11-07 21:47:26
【问题描述】:

在我的 C 程序中,我使用printf 将格式化字符串打印到stdout,然后使用readline 从用户那里获取输入,并能够移动光标和浏览历史记录。问题是如果我输入一个字符然后按退格键,整行,包括printf 打印的字符串,都会被删除。有没有办法解决这种不良行为?我应该将此作为错误报告给readline 开发人员吗?还是应该将格式化文本打印到缓冲区,然后将其用作readline 的提示?

类似代码的示例:

...
printf("Some formatted text",...);
foo(buffer,length);
....

在 foo 里面:

{
...
temp=readline(NULL);
//Checking length...
...
strcpy(buffer,temp);
free(temp);
....
}

【问题讨论】:

  • 这可能是由于您的终端的键映射。见man 3 readline。默认情况下,行编辑命令类似于emacs的...
  • 您无法打印到 readline 的输入。这不是标准输入和标准输出的工作方式。输入就是输入,输出就是输出。没有环回。但是,如果您在回调中这样做,您可以使用 readline 函数将文本插入到 readline 缓冲区中。请参阅stackoverflow.com/a/33346124/1566221,我认为它符合重复的条件。
  • 我不打算使用 printf 打印到 readline 输入。 printf 打印到标准输出和 readline 应该从标准输入读取?为什么退格允许 readline 删除 printf 写入标准输出的内容?我会检查手册页。
  • 我通过将格式化文本写入字符数组然后将其传递给 readline 的提示参数来解决此问题。我更新了描述,因为它有点令人困惑@rici
  • 提示不可编辑。

标签: c linux printf readline


【解决方案1】:

如果您希望字符串出现在与您使用readline 输入和阅读的行相同的终端行,您应该将该字符串作为readline 的“提示”参数。这对于您设置事物的方式很困难(在调用 readline 的函数之外打印提示),但如果您可以更改它,您可以修复它:

char prompt[64];  // or some larger size
snprintf(prompt, sizeof(prompt), "Some formatted test", ...
foo(prompt, buffer, length);


foo(const char *prompt, char *buffer, size_t length) {
  ...
  temp = readline(prompt);
  // Checking length

【讨论】:

  • 我用 sprintf 做这个,因为我需要的格式说明符是整数类型,但每当我需要字符串格式时,我都会使用 snprintf。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多