how*_*ghk 6 c pthreads readline libreadline
对不起,长标题.我正在用C开发一个网络程序,它可以在stdout上显示从网络接收的消息,并通过GNU readline库接受stdin上的用户输入.问题是,当用户通过readline在主线程上键入命令时,网络消息到达并输出到stdout,这将生成如下内容:
场景:
输入:1234567890
网络消息:Hello
当用户输入"7"时,网络消息到达
终端的实际输出:
输入> 1234567Hello
890_
有没有办法让这样的输出?
你好
输入> 1234567890_
ps _是光标.
提前致谢!
好的我在搜索后找到了解决方案,并将以下替换为printf().通过使用rl_replace_line("",0)它将清除当前行并将光标放在行的开头,然后我可以打印一行消息,然后恢复readline提示,将原始行替换回原位,并且恢复光标位置.
但是,这个hack需要调用这个printf函数才能在最后包含一个\n,否则该行将被readline覆盖.
#define printf(...) my_rl_printf(__VA_ARGS__)
void my_rl_printf(char *fmt, ...)
{
int need_hack = (rl_readline_state & RL_STATE_READCMD) > 0;
char *saved_line;
int saved_point;
if (need_hack)
{
saved_point = rl_point;
saved_line = rl_copy_text(0, rl_end);
rl_save_prompt();
rl_replace_line("", 0);
rl_redisplay();
}
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
if (need_hack)
{
rl_restore_prompt();
rl_replace_line(saved_line, 0);
rl_point = saved_point;
rl_redisplay();
free(saved_line);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1255 次 |
| 最近记录: |