ANSI游标索引是否可移植

时间:2013-02-10 20:13:11

标签: c cross-platform portability

我写了一个小型控制台程序,需要偶尔清除终端屏幕。我在/ 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标准编译器的所有系统上进行编译和运行?“

2 个答案:

答案 0 :(得分:2)

对于像这样的跨平台终端操作,我建议ncursespdcurses

#include <curses.h>

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

void cls() {
    clear();
    move(0, 0);
}

答案 1 :(得分: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");