【问题标题】:Moving cursor in the terminal output C language在终端输出C语言中移动光标
【发布时间】:2020-06-28 12:14:35
【问题描述】:

目前我发现我可以在终端输出中移动光标,就好像我在 Word 中使用 "\033[A" 将光标移动到上面的行并将 "\033[B" 移动到下面的行一样。 所以我试图理解更多的东西,我用 C 写了这两行代码:

#include <stdio.h>
#include <stdlib.h>
int main (){
printf("\n 2 3 \033[A \033[D 1 \033[B \n 4 5 6");
}

这是输出:

      1 
 2 3
 4 5 6

我的期望不同,因为这是我的预期输出

1
2 3
4 5 6

所以我遗漏了一些信息,我想我可能需要一个像“\t”一样说“回到一个位置”的字符,但恰恰相反。我在一些旧帖子中找到了这个页面Here

但有些字符不起作用。 有人可以解释一下这些东西是如何工作的吗?因为我试过"\033[C" 和"\033[D" 左右移动,但什么也没有。

【问题讨论】:

  • ASCII 表可能有助于识别您正在寻找的某些字符。 \b(二进制10,八进制\010)例如是退格键。顺便说一句,我运行了你的确切代码,得到了一些不同的东西。
  • question/answers 有帮助吗? (你可能不喜欢这些答案。)
  • 不错的技术参考VT100 User Guide

标签: c linux terminal output character


【解决方案1】:

这些序列称为 ANSI 转义序列,可以追溯到 1970 年代的 DEC VT-100 终端,因此它们有时仍称为 VT-100 转义序列。 有一个列表herehere

您感兴趣的代码是:

Esc[ValueA  Move cursor up n lines  CUU
Esc[ValueB  Move cursor down n lines    CUD
Esc[ValueC  Move cursor right n lines   CUF
Esc[ValueD  Move cursor left n lines    CUB

您可能没有考虑到的一件事是,这些动议并不关心给定行上有“多少信息”;他们只是将屏幕视为字符网格。所以 ESC[A 直线上升一行,即使它“超过了前一行的末尾”。以此类推。

所以要向上移动一行并留下两个字符:

printf("\033[A\033[2D");

\033 是 ESC 的 ASCII 码(八进制 - 有时你会看到它是十六进制的 \x1b;同样的)。不要添加任何额外的空格或换行符;直接打印代码即可。

【讨论】:

  • 有趣 - 您能否在答案中添加一个简单的 printf 行,以准确显示将光标向上和向左移动的样子?
  • 你知道如何在 C 语言中使用这些值吗?我的意思是像 printf("... ESC...") ?
  • 添加了一个例子。希望对您有所帮助!
  • 如果您认为是正确的,请随时将我的答案标记为正确。谢谢!
猜你喜欢
  • 2018-12-05
  • 1970-01-01
  • 2014-08-28
  • 2019-02-11
  • 1970-01-01
  • 2011-07-17
  • 2017-02-02
  • 2013-01-07
  • 2018-08-05
相关资源
最近更新 更多