2013-08-25 34 views
1

gotoxy()函數用printf()的位置

你好
我工作的一個項目,其需要的gotoxy()功能
我已閱讀gotoxy() implementation for Linux using printf

我不知道爲什麼

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,光標在第一行
我想知道爲什麼遊標不會在第二行時,我= 1?

回答

2

x和y的順序很重要,因爲變量的名稱對gotoxy()函數的操作沒有意義。

該函數輸出移動到指定座標的終端命令序列。當終端看到該命令序列並對其進行處理時,首先預期y。

順便說一句,請小心使用此解決方案,因爲這高度依賴於運行程序的終端類型。爲了獲得廣泛的終端支持隨機移動和「繪圖」在終端屏幕上,ncursescurses是你最好的選擇。儘管如此,他們很難學習。

1

使用終端轉義序列時,列和行的位置不從0開始。他們從1開始。

您需要刷新stdout才能看到光標移動。

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

OP:「爲什麼需要改變xy順序」。
光標位置命令的格式是

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

需要的產生是由於以匹配格式,讓您的y變量作爲ROWy至上。 (你可以旋轉你的屏幕90度)。

OP:爲什麼光標在i = 1時不會進入第二行?
家庭位置,在左邊的屏幕是起源是線,列

注意:您可以將轉義字符格式,

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

顯示' [{ROW}; {COLUMN} f'這個函數是如何將整個事情帶回家的。 – ryyker

0

GotoXY是一個函數或過程,它將光標定位在(X,Y),X爲水平,Y爲相對於當前窗口原點的垂直方向。原點位於窗口左上角(1,1)處。