2

您好,
我正在做一个需要gotoxy()功能的项目,
我已经使用 printf 阅读了 Linux 的 gotoxy() 实现

我想知道为什么

void gotoxy(int x,int y)
{
    printf("%c[%d;%df",0x1B,y,x);
}

需要更改printf中的xy顺序,只是为了适应坐标系吗?
以我的方式,我将其更改printf("%c[%d;%df",0x1B,x,y)为满足我的需求

仍然,在我gotoxy()在 for 循环中使用它时,如下所示:

for( int i = 0; i < 12; i++ ) {
        for( int j = 0; j < 12; j++ ) {
            gotoxy( i , j );
            usleep(500000);
        }
    }

当 i = 0 和 i = 0 时,光标在第一行
我想知道为什么当 i = 1 时光标不转到第二行?

4

4 回答 4

3

OP:“为什么需要更改 xy 顺序”。
光标位置命令的格式是

Force Cursor Position   <ESC>[{ROW};{COLUMN}f

之所以需要,是因为首先要匹配该格式并将您的y变量作为ROWy。(您可以将屏幕旋转 90 度)。

OP:为什么当 i = 1 时光标没有转到第二行?屏幕左上角的起始位置是 Origin 是line
1 column 1

注意:您可以将转义字符放在格式中,

printf("\x1B[%d;%df", y, x);
fflush(stdout);  // @jxh
于 2013-08-25T05:11:31.237 回答
2

x 和 y 的顺序很重要,因为变量的名称对 gotoxy() 函数的操作没有意义。

该函数正在输出移动到指定坐标的终端命令序列。当终端看到该命令序列并对其进行处理时,首先需要 y。

顺便说一句,请小心使用此解决方案,因为这高度依赖于运行程序的终端类型。为了在终端屏幕上通过随机移动和“绘图”获得广泛的终端支持,ncurses或者curses是您最好的选择。不过,他们一开始很难学习。

于 2013-08-25T04:44:54.800 回答
1

使用终端转义序列时,列和行位置不从 0 开始。它们从 1 开始。

您需要冲洗stdout才能看到光标移动。

void gotoxy(int x,int y)
{
    printf("%c[%d;%df",0x1B,y,x);
    fflush(stdout);
}
于 2013-08-25T04:48:45.123 回答
0

GotoXY 是一​​个函数或过程,将光标定位在 (X,Y),X 在水平方向,Y 在垂直方向相对于当前窗口的原点。原点位于窗口的左上角 (1,1)。

于 2013-11-06T16:20:05.977 回答