c - ANSI 游标索引是否可移植

标签 c cross-platform portability

我编写了一个需要偶尔清除终端屏幕的小型控制台程序。我在 *nix 系统上/为 *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 标准编译器的系统上编译并正常运行?”

最佳答案

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

VT100 终端模拟器绝对是最常见的(包括 xterm 和其他“X-windows 样式外壳”的默认设置)。

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

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

printf("\033[2J");

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

#define ESC_STR "\033"

printf(ESC_STR"[2J");

关于c - ANSI 游标索引是否可移植,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14802126/

相关文章:

delphi - 跨平台商业开发工具/IDE/编程语言(原生)

.net - ISO C++ 代码是否可以在 C++/CLI 中直接编译?

Java和Firebird Embedded如何设置?

c - LED 同时闪烁,具有独立且不一致的模式

c - 为什么我们在 C 中有 unsigned 和 signed int 类型?

c - realloc 上的无效地址

android - 移动开发 - 原生 VS 跨平台 VS JavaScript

c++ - 在 C++ 中,将静态成员函数指针用于 C API 回调是否安全/可移植?

c# - 如何最轻松地访问 .NET PE 文件中的特定字段?

c - C 中随机不使用 rand() 函数