○エスケープシーケンス

エスケープシーケンスとはターミナルを制御(カーソル位置や色など)する制御文字をあらわし、
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);


▲トップページ > その他