终端输出C语言中移动光标

问题描述 投票:0回答:2

目前我发现我可以在终端输出中移动光标,就像我在Word中编写一样,使用“[A”将光标移动到上一行,使用“[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

所以我错过了一些信息,我认为我可能需要一个角色说“返回一个位置”,例如“”,但相反。我在一些旧帖子中找到了此页面这里

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

c linux terminal output character
2个回答
3
投票

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

您感兴趣的代码是:

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
;同样的事情)。不要添加任何额外的空格或换行符;直接打印代码即可。


0
投票

对于您的预期输出,

#include <stdio.h>
#include <stdlib.h>
int main (void){
printf("\n2 3\033[F1\033[B\033[B\n4 5 6");
}

这将为您提供正确的结果。 不需要[D(AD~A)。如果您使用此行,它会将光标移动到上一行的当前位置,但不会向后移动到上一行的开头。相反,你必须使用 [F.

© www.soinside.com 2019 - 2024. All rights reserved.