使用 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()的主要内容,如果未能解决你的问题,请参考以下文章

goto

Linux C 编程学习第四天_循环语句_while_do/while_for_goto

将 goto 标签暴露给符号表

C语言中goto语句的用法??举例来说。

C goto

Java中的"goto"实现