○エスケープシーケンス
エスケープシーケンスとはターミナルを制御(カーソル位置や色など)する制御文字をあらわし、
ESC : 8進数で033 から始まる文字列です
C言語ではprintfで出力してターミナルを制御します
printf("\033[2J") //画面クリア
printf("\033[0K") //カーソル位置からその行の右端までをクリア
printf("\033[1K") //カーソル位置からその行の左端までをクリア
printf("\033[2K") //カーソル位置の行をクリア
printf("\033[%d;%dH" ,10,20) //カーソル位置を、高さ10行目、横20行目に移動
printf("\033[%dC" ,10) //カーソルを10行だけ右に移動
printf("\033[%dD" ,10) //カーソルを10行だけ左に移動
printf("\033[%dB" ,10) //カーソルを10行だけ下に移動
printf("\033[%dA" ,10) //カーソルを10行だけ上に移動
printf("\033[30m");//黒の文字に変更
printf("\033[31m");//赤の文字に変更
printf("\033[32m");//緑の文字に変更
printf("\033[33m");//黄色の文字に変更
printf("\033[34m");//青の文字に変更
printf("\033[35m");//マゼンダの文字に変更
printf("\033[36m");//シアンの文字に変更
printf("\033[37m");//白の文字に変更
printf("\033[39m");//文字の色を通常の色に戻す
printf("\033[40m");//文字の背景を黒色に変更
printf("\033[41m");//文字の背景を赤色に変更
printf("\033[42m");//文字の背景を緑色に変更
他の背景色は上の文字の色の番号を参考にしてください。
printf("\033[49m");//文字の背景を通常に戻す
などなどたくさんあります
Windows のコマンドプロンプトでは動作しませんでした
Windowsではエスケープシーケンスを有効にしないと動作しません
CygwinおよびLinux上では動作します
■画面上の高さ10行目、横20行目で数字をカウントアップするプログラム
#include <stdio.h>
#define clr printf("\033[2J") //画面クリア
#define clr_right printf("\033[0K") //カーソル位置からその行の右端までをクリア
#define clr_left printf("\033[1K") //カーソル位置からその行の左端までをクリア
#define clr_line printf("\033[2K") //カーソル位置の行をクリア
#define location(x,y) printf("\033[%d;%dH" ,x,y) //カーソル位置を移動
#define right(x) printf("\033[%dC" ,x) //カーソルを指定数だけ右に移動
#define left(x) printf("\033[%dD" ,x) //カーソルを指定数だけ左に移動
#define down(x) printf("\033[%dB" ,x) //カーソルを指定数だけ下に移動
#define up(x) printf("\033[%dA" ,x) //カーソルを指定数だけ上に移動
main(){
int i;
clr;//画面クリア
for(i=0;i<100;i++){
location(10,20);//カーソル位置をheight 10 width 20に移動
printf("%d",i);
fflush(stdout);//バッファをフラッシュ
sleep(1);
}
}
■どうしてもWindowsで利用出来ない方はAPIを使うとコマンドプロンプトで代用出来ます
もちろんAPIなので #include <windows.h> を書く必要があります。
▼カーソル移動、Windows Linuxとほぼ同じ動きをするコード
i,jがカーソル位置
#ifdef WINDOWS
//Windows
static HANDLE h;
if(!h) h=GetStdHandle(STD_OUTPUT_HANDLE);
COORD st;
i=i-1;
if(0>i) i=0;
j=j-1;
if(0>j) j=0;
st.X = (short)i;
st.Y = (short)j;
SetConsoleCursorPosition(h,st);
#else
if(1>i) i=1;
if(1>j) j=1;
printf("\033[%d;%dH" ,j,i); //カーソル位置を移動
fflush(stdout);
#endif
▼画面クリア、Windows Linuxとほぼ同じ動きをするコード
#ifdef WINDOWS
static CONSOLE_SCREEN_BUFFER_INFO csbi;
static HANDLE h;
static COORD st;
if(!h) h=GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo( h, &csbi );
DWORD size = (csbi.dwSize.X * csbi.dwSize.Y);
SetConsoleCursorPosition( h, st );
FillConsoleOutputCharacter( h, ' ', size, st, NULL );
SetConsoleCursorPosition( h, st );
#else
printf("\033[2J"); //画面クリア
fflush(stdout);
#endif
▼文字の色と背景色の変更 Windowsのみ動作
static HANDLE h;
if(!h) h=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(h,FOREGROUND_RED | FOREGROUND_BLUE | BACKGROUND_GREEN);
//次の色を組み合わせて使用する 上は赤と青の組み合わせでマゼンダの文字に緑の背景
//前景色
//FOREGROUND_BLUE
//FOREGROUND_GREEN
//FOREGROUND_RED
//FOREGROUND_INTENSITY
//背景色
//BACKGROUND_BLUE
//BACKGROUND_GREEN
//BACKGROUND_RED
//BACKGROUND_INTENSITY
▼ちなみに、現在のカーソル行を取得するにはGetConsoleScreenBufferInfoで取得できます
#include <stdio.h>
#include <windows.h>
int main(){
static HANDLE h;
if(!h) h=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(h,&csbi);
printf("横%d 縦%d\n",csbi.dwCursorPosition.X,csbi.dwCursorPosition.Y);
return 0;
}
▽現在のカーソル行が取得できたら、一行上に移動するなどが出来ます
static HANDLE h;
if(!h) h=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(h,&csbi);
//横のカーソル位置
csbi.dwCursorPosition.X=0;
//縦のカーソル位置を一行上にする
if(csbi.dwCursorPosition.Y)--csbi.dwCursorPosition.Y;
SetConsoleCursorPosition(h,csbi.dwCursorPosition);
▲トップページ
>
その他