gotoxy()函数使用printf()的位置

时间:2013-08-25 04:36:42

标签: c linux printf coordinate-systems

你好 我正在开展一个需要gotoxy()功能的项目 我看过gotoxy() implementation for Linux using printf

我想知道为什么

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

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

stil,在我使用此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 个答案:

答案 0 :(得分:3)

OP:“为什么需要改变x y顺序”。
光标位置命令的格式为

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

出现需要是因为要匹配该格式并将y变量作为 ROW y首先出现。 (您可以将屏幕旋转90度)。

OP:当i = 1时,为什么光标不会进入第二行? 屏幕左侧上方的起始位置是原点 1 ,列 1

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

printf("\x1B[%d;%df", y, x);
fflush(stdout);  // @jxh

答案 1 :(得分:2)

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

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

顺便说一下,请小心这个解决方案,因为这高度依赖于运行程序的终端类型。为了获得随机移动的广泛终端支持并在终端屏幕上“绘图”,ncursescurses是您最好的选择。起初他们很难学习。

答案 2 :(得分:1)

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

您需要刷新stdout才能看到光标移动。

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

答案 3 :(得分:0)

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