我正在c中编写一个简单的即时消息客户端。它目前运行良好,但是如果用户在键入时键入并收到消息,则消息显示在文本之后,然后用户继续在下面的行中。它看起来像这样:
USER:我正在努力......朋友:你好
消息。 < ---(用户消息的结尾)
我的想法是:
以某种方式从stdin强制当前数据并将其加载到缓冲区中,然后在打印FRIEND之前使用\ r \ n:擦除行上的内容,然后从缓冲区打印。有没有人有任何具体的例子来说明如何完成这项任务?
最终结果应为
朋友:你好
USER:我正在尝试输入消息
用户开始输入消息,收到消息,stdin行向下移动,然后用户完成了他们的消息。
注意:我在最新版本的Linux Mint上运行GNOME Terminal 3.6.2
答案 0 :(得分:1)
通常的方法是使用ncurses(任何类型的curses都可以使用),接受一个窗口中的输入并将结果写入另一个。这是一个简短的例子:
#include <curses.h>
int
main(void)
{
bool done = FALSE;
WINDOW *input, *output;
char buffer[1024];
initscr();
cbreak();
echo();
input = newwin(1, COLS, LINES - 1, 0);
output = newwin(LINES - 1, COLS, 0, 0);
wmove(output, LINES - 2, 0); /* start at the bottom */
scrollok(output, TRUE);
while (!done) {
mvwprintw(input, 0, 0, "> ");
if (wgetnstr(input, buffer, COLS - 4) != OK) {
break;
}
werase(input);
waddch(output, '\n'); /* result from wgetnstr has no newline */
waddstr(output, buffer);
wrefresh(output);
done = (*buffer == 4); /* quit on control-D */
}
endwin();
return 0;
}
如果您想了解VT100控制代码(与ECMA-48不同),vt100.net有一些终端手册。
关于链接 VT100 control codes :这是错误信息的来源,如ncurses常见问题 How do I get color with VT100?
中所述