目前我发现我可以在终端输出中移动光标,就像我在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”]左右移动,但什么也没有。
这些序列称为 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
;同样的事情)。不要添加任何额外的空格或换行符;直接打印代码即可。
对于您的预期输出,
#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.