gpt4 book ai didi

c - 如何使用 termcap 库在终端中设置接口(interface)

转载 作者:行者123 更新时间:2023-11-30 14:55:22 27 4
gpt4 key购买 nike

我需要使用 C 中的 termios.h 在终端中创建一个接口(interface)。为了保持简短,我必须创建一个像 ./exec 这样的可执行文件 并且在我运行后,它必须停止显示 PS1 变量。如果我有一个使用 printf 显示以下文本 Hello World 的程序,它将如下所示:

$:> ./exec
Hello World!

但我不需要打印它,而是只需要在终端中显示 Hello World!,就像在程序显示时清除屏幕一样。

Hello World!

换句话来说,目的是清理终端,当./exec运行时,它也应该清除这一行, $:> ./执行

到目前为止我成功实现了这个功能

void    clear_screen()
{
char buf[1024];
char *str;

tgetent(buf, getenv("TERM"));
str = tgetstr("cl", NULL);
fputs(str, stdout);
}

这会清除屏幕,但会保留命令本身的行$:> ./exec。我不允许使用 ncurses.h 库。

这是一个主要内容:

int main(void)
{
clear_screen();
printf("Hello World!\n");
return (0);
}

最佳答案

问题中遗漏了一些内容(它混淆了 termcap 和 termios)。由于示例代码使用 termcap,答案应该解决这个问题。回顾一下,这是一个完整的示例:

#include <stdio.h>
#include <stdlib.h>
#include <termcap.h> /* this comes from ncurses, anyway... */

static void clear_screen(void)
{
char buf[1024];
char *str;

tgetent(buf, getenv("TERM"));
str = tgetstr("cl", NULL);
fputs(str, stdout);
}

int main(void)
{
clear_screen();
printf("Hello World!\n");
return (0);
}

“cl” 功能才是最重要的。它被定义为terminfo clear的对应特征。 :

   clear_screen                  clear      cl        clear screen and
home cursor (P*)

如果您使用正确编写的终端描述从命令行运行该示例,则输出将执行以下操作:

  • 清除整个显示,
  • 将光标移至起始位置
  • 打印一条消息(位于屏幕的第一行)
  • 退出

之后,shell 再次打印提示符。

这个例子有几个问题:

  • 它使用fputs进行输出。 terminfo/termcap 数据可能包含填充,但这不起作用。您不会注意到常见终端仿真器的终端描述,但它对于硬件终端很重要。例如,vt100 termcap 将具有以下内容(“50”是填充):
    :cl=50\E[H\E[J:

正确使用的函数是tputs。它恰好位于 termcap 之间的一组重叠函数中。和 terminfo 。在ncurses中,完整的描述在terminfo manual page中.

  • 某些终端(Microsoft telnet 曾经是一个很好的例子,尽管最近没有人测试过......)没有正确处理控制序列。在前面的示例中,人们可能使用过
    :cl=\E[J\E[H

为了演示这一点:终端没有清除整个屏幕,而是仅清除其余部分。为了解决这个问题,终端描述被修改为首先移动光标。

关于c - 如何使用 termcap 库在终端中设置接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45941327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com