如何打印命令行C上的内容

时间:2019-05-09 16:41:40

标签: c command-line printing

要建立聊天,我必须发送和接收消息。 当前,我正在从命令行发送和接收消息。 当我在键入消息时收到一条消息时,收到的消息将被打印,并且看不到之前键入的内容。我使用read()命令捕获用户输入。

这里是一个示例:

假设我要发送消息Hello World,并且在键入Hello Wor后收到消息。

这就是发生的事情:

$ Enter your message : Hello Wor
$ Somebody: This is a message 
$ Enter your message :

但是Hello Wor仍在命令行上:如果按Delete键,则会看到Hello Wo。 这就是我想要的:

$ Enter your message : Hello Wor
$ Somebody: This is a message 
$ Enter your message : Hello Wor

我想保存打印收到的消息之前输入的内容并打印出来。

1 个答案:

答案 0 :(得分:1)

在不使用诸如cursesncurses之类的终端控制API的情况下,您需要将程序更改为按以下方式工作:

  1. 禁用本地回显,因此您的程序会在插入符号在终端中呈现之前处理每个本地按键
  2. 您的本地按键处理代码需要为异步,因此它在等待用户输入消息的下一个字符或{{1}时不会阻塞getchar }。
    • 这很重要,因此您的程序仍可以运行以收集和显示在网络端收到的消息。虽然您可以为此使用第二个线程,但这意味着两个线程将同时使用[Enter],这是不可取的,而您可以使用线程同步原语来防止此错误,最好使用异步改为使用IO API。
    • 重要说明:“异步”代码并不意味着“并发”,也不意味着使用线程。实际上,这意味着程序的线程将返回到中央调度程序(合作产生)而不是阻塞IO,并且IO操作完成时,调度程序将在产生的函数处恢复函数(这是stdio关键字的作用)在C#和JavaScript中)。
    • 但是,在C语言中,working with the asynchronous terminal/console API in Linux is a PITA最好使用await之类的库来为您处理。
  3. 程序收到要显示的消息时,您将清除窗口的底行(通过用空格覆盖或使用VT100 ncurses覆盖),编写收到的消息,然后重新编写用户输入的不完整信息输入(如果有的话)换行。
  4. 重复。