我写了一个小型控制台程序,需要偶尔清除终端屏幕。我在/ 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标准编译器的所有系统上进行编译和运行?“
答案 0 :(得分:2)
对于像这样的跨平台终端操作,我建议ncurses和pdcurses:
#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");