gpt4 book ai didi

c - 如何使用 ANSI 代码在 C 中获取光标位置

转载 作者:太空宇宙 更新时间:2023-11-04 00:16:07 24 4
gpt4 key购买 nike

我试图从一个小的 c 程序中获取光标位置,所以在谷歌搜索后我发现了这个 ANSI 代码 \x1b[6n。它应该返回光标的 x 和 y 位置(如果我没记错的话)所以printf("\x1b[6n");给我输出:;1R我无法理解 x 和 y 位置方面的输出。

编辑:平台是 Linux (xterm)

最佳答案

一些终端上,例如DEC VT102和后来的 VT,以及许多终端仿真器,特别是 XTerm及其许多模仿,发送 Esc [ 6 n 将使终端响应 Esc [ ; R,其中columntext 光标位置的十进制表示。

因此您的终端模拟器回复;1R;它回复正确,但 readline 例程正在吃 Esc [ 和十进制数字到 ; (并闪烁屏幕或发出哔哔声,取决于配置)。

这是一个很好的 Bash 命令来说明:

out=''; \
echo $'\e[6n'; \
while read -n 1 -s -t 1; do out="$out$REPLY"; done < /dev/tty; \
echo -n "$out" | od -A x -t x1z -v

运行这个给出:

$ out=''; \
> echo $'\e[6n'; \
> while read -n 1 -s -t 1; do out="$out$REPLY"; done < /dev/tty; \
> echo -n "$out" | od -A x -t x1z -v

000000 1b 5b 31 36 3b 31 52 >.[16;1R<
000007

请注意,答案不一定来自标准输入:答案来自终端,即使标准输入被重定向也是如此。

应询问者的要求,这里有一个小的 C 程序,它部分复制了上述 scriptlet 的功能。请注意,该程序不会处理将终端设置为原始模式并返回熟模式的问题;这必须在程序之外处理,如下所示。

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main (void)

{
int ttyfd = open ("/dev/tty", O_RDWR);
if (ttyfd < 0)
{
printf ("Cannot open /devv/tty: errno = %d, %s\r\n",
errno, strerror (errno));
exit (EXIT_FAILURE);
}

write (ttyfd, "\x1B[6n\n", 5);

unsigned char answer[16];
size_t answerlen = 0;
while (answerlen < sizeof (answer) - 1 &&
read (ttyfd, answer + answerlen, 1) == 1)
if (answer [answerlen ++] == 'R') break;
answer [answerlen] = '\0';

printf ("Answerback = \"");
for (size_t i = 0; i < answerlen; ++ i)
if (answer [i] < ' ' || '~' < answer [i])
printf ("\\x%02X", (unsigned char) answer [i]);
else
printf ("%c", answer [i]);
printf ("\"\r\n");

return EXIT_SUCCESS;
}

假设这个小程序是answerback.c:

$ gcc -Wall -Wextra answerback.c -o answerback
$ stty raw -echo; ./answerback; stty sane

Answerback = "\x1B[24;1R"
$ _

关于c - 如何使用 ANSI 代码在 C 中获取光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50884685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com