1

我编写了一个小型控制台程序,需要偶尔清除终端屏幕。我为 *nix 系统编写了代码并system("clear")在这些实例中使用。一旦我的代码完成,我就会对其进行审查以评估我的代码的可移植性。上述清除屏幕的方法是我唯一明显的可移植性问题。然后,我寻找其他可能的方法来清除终端,并在 上找到了一些文档ANSI Cursor Indexing,特别是:

void cls() {
  //27 is ESC ASCII char
  printf("%c[2J",27);   //clears screen
  printf("%c[0;0H",27); //sets cursor at [0,0]
}

令我惊讶的是,这段代码在我的 *nix 系统上运行得非常好。我想知道,这个 ANSI 光标索引方案是否可移植?这段代码能否在所有使用 C 标准编译器的系统上按预期编译和运行?”

4

2 回答 2

2

对于像这样的跨平台终端操作,我会推荐ncursespdcurses

#include <curses.h>

// Init curses somewhere before in your code
initscr();

void cls() {
    clear();
    move(0, 0);
}
于 2013-02-10T20:17:15.190 回答
2

ANSI 和 VT100 转义序列非常接近,这意味着如果终端是这两个中的任何一个,上面列出的命令集肯定会起作用。但请记住,ANSI 是 VT100 的超集,因此 VT100 兼容终端不会理解所有 ANSI 序列。

VT100 终端仿真器是绝对最常见的终端仿真器之一(包括 xterm 和其他“X-windows 样式 shell”的默认设置。

很明显,一个 Volker-Craig 404 终端仿真器 [有人用吗?;)] 不会理解 ANSI 或 VT100 转义序列,或者实际上任何转义序列。

我还要指出,通过将 ESC 合并到常量字符串中,您的代码会更简单:

printf("\033[2J");

或者如果你想让它更具可读性:

#define ESC_STR "\033"

printf(ESC_STR"[2J");
于 2013-02-10T20:19:38.127 回答