【问题标题】:gotoxy() implementation for Linux using printf使用 printf 为 Linux 实现 gotoxy()
【发布时间】:2011-12-30 20:03:36
【问题描述】:

我正在为 gcc 编译器寻找 gotoxy() 的替代品,结果发现了这个 -

void gotoxy(int x,int y)
{
    printf("%c[%d;%df",0x1B,y,x);
}

我想知道它是如何运作的,我的意思是我们什么时候在 printf 中使用 [;0x1B 在那里做什么以及如何使用此代码将光标带到行/列?

我从来没有在书中看到过这种 printf 的做法,所以如果你能指出一个链接,我可以找到关于 printf 的这种用法的链接。

【问题讨论】:

  • 使用%c 来格式化常量似乎很不寻常。以下是等价的:printf("\x1b[%d;%df",y,x);
  • 是的,流行也是'\033'。如果我使用%c 格式说明符,我会将其写为27 - 我很清楚它是ESC(又名Ctrl-[^[)。

标签: c printf


【解决方案1】:

这是使用terminal escape codes 定位光标。

"\x1B" 是转义字符,它告诉您的终端接下来的内容不是要打印在屏幕上,而是向终端(或很可能是终端模拟器)发出的命令

尾随的“f”表示您想将光标强制定位在某处,由其前面的坐标指示。

Force Cursor Position   <ESC>[{ROW};{COLUMN}f

因此,如果您调用gotoxy(4,2),它最终会发送转义序列"(ESC)[2;4f",其中ESC 是字节0x1B

【讨论】:

  • 感谢乔纳森!这真的很有帮助,而且很容易理解。
  • 我的荣幸。我最近不得不对这些转义序列做很多解释,所以我立刻就想到了。
  • 顺便说一下 - 小心这种技术。它高度依赖于程序运行的终端类型。并非所有终端仿真器都对这样的序列赋予相同的含义。
  • @user2532621 明白了。这就是 curses 和 termcap 的用途。然而,我回答的是相反的问题:“这个实现是做什么的?”不是“我该如何实现这个?”
【解决方案2】:

这些被称为ANSI Escape Sequences,源自于 1978 年推出的DEC VT100 显示终端。

【讨论】:

    【解决方案3】:

    这称为 ANSI 转义码。好久没看到用过的了。这是一个解释它们的页面:

    http://en.wikipedia.org/wiki/ANSI_escape_code

    【讨论】:

      猜你喜欢
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多