使用 printf 为 Linux 实现 gotoxy()
Posted
技术标签:
【中文标题】使用 printf 为 Linux 实现 gotoxy()【英文标题】:gotoxy() implementation for Linux using printf 【发布时间】: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-[
或^[
)。
【参考方案1】:
这是使用terminal escape codes 定位光标。
"\x1B"
是转义字符,它告诉您的终端接下来的内容不是要打印在屏幕上,而是向终端(或很可能是终端模拟器)发出的命令
尾随的“f”表示您想将光标强制定位在某处,由其前面的坐标指示。
Force Cursor Position <ESC>[ROW;COLUMNf
因此,如果您调用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
【讨论】:
以上是关于使用 printf 为 Linux 实现 gotoxy()的主要内容,如果未能解决你的问题,请参考以下文章