1

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

$:> ./exec
Hello World!

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

Hello World!

换一种说法,目的是为了清理终端,运行的时候./exec也要清除这条线,$:> ./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);
}
4

2 回答 2

1

问题中省略了某些内容(并且将 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"能力才是最重要的。它被定义为terminfoclear的对应特征:

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

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

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

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

这个例子有几个问题:

  • fputs用于输出。terminfo/termcap 数据可能包括填充,这将无法使用。您不会注意到普通终端仿真器的终端描述,但它对硬件终端很重要。例如,vt100 termcap 会有这个(“50”是填充):
    :cl=50\E[H\E[J:

正确使用的功能是tputs. 它恰好位于termcapterminfo之间的一组重叠函数中。在 ncurses 中,完整的描述在terminfo 手册页中。

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

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

于 2017-12-28T12:21:43.553 回答
0
printf("\033[2J"); // clear screen
printf("\033[H"); // cursor home

如果您想对屏幕做任何事情,这是一种方法。您可以从“一些程序员老兄的评论”中查找其他代码。您也可以谷歌 vt100 代码。

有一些库像 Ncurses 一样抽象了这个,但是因为你不能使用它(为什么?),所以我会让其他人详细说明,也许还有其他允许的..

编辑

尝试这个:

printf("\033[1A\r\033[2K");

看我的评论。

VT100 代码也无济于事

如果你想用屏幕vt100代码做任何事情就像黑客的梦想成真。奔跑吧,如果你看到 DEA 来了,他们就是那么好。

于 2017-08-29T15:08:25.220 回答