エスケープシーケンスとは
エスケープシーケンス (escape sequence) とは、コンピュータシステムにおいて、通常の文字列では表せない特殊な文字や機能を、規定された特別な文字の並びにより表したもの。
例えば、 printf("\n");
と書くと \n
という文字列を出力するのではなく改行文字が出力されますね。
このように、出力することで画面を操作できる文字コードをエスケープシーケンスと呼びます。
他にもたくさんのエスケープシーケンスがあるので、知っている範囲でご紹介します。
特殊文字
文字コード | 意味 |
---|---|
\a | ベル文字(アラート) |
\b | 1文字分戻る |
\f | ページ送り(クリア) |
\n | 改行、復帰 |
\r | 同じ行の先頭に戻る |
\t | 水平タブ |
\v | 垂直タブ |
-
\f
と\v
はプリンタ出力用で、コンソール上では横方向の位置そのままで次の行に移動する場合が多いようです。 -
\b
や\r
でカーソルの位置を戻してもそれまでの出力は消えていない点には注意する必要があります。
サンプルコード
#include <stdio.h>
int main()
{
//カーソルを行の先頭に戻す
printf("aaaaaaaaa\rXX\n");
//カーソルを2文字分戻す
printf("aaa\b\bX\n");
return (0);
}
$ ./a.out
XXaaaaaaa
aXa
画面制御
文字コード | 意味 |
---|---|
\033[0J |
カーソル位置から画面右下まで消去 |
\033[1J |
画面左上からカーソル位置まで消去 |
\033[2J |
画面クリア |
\033[0K |
カーソル位置から同じ行の右側消去 |
\033[1K |
カーソル位置から同じ行の左側消去 |
\033[2K |
カーソルのある1行の消去 |
\033[nA |
カーソルをn行上へ移動 |
\033[nB |
カーソルをn行下へ移動 |
\033[nC |
カーソルをn桁右へ移動 右端で停止 |
\033[nD |
カーソルをn桁左へ移動 左端で停止 |
\033[r;nH |
カーソルをr行、n桁目へ移動 |
###サンプルコード
#include <stdio.h>
int main()
{
//カーソルを行の先頭に戻して右側の出力を削除
printf("aaaaaaaaa\r\033[0KXX\n");
//カーソルを2文字分戻してその行の出力を削除
printf("aaa\b\b\033[2KX\n");
return (0);
}
$ ./a.out
XX
X
#include <stdio.h>
int main()
{
//画面をクリアしてカーソルを1行目1桁目に移動
printf("\033[2J\033[1;1H");
return (0);
}
文字制御
文字修飾
文字コード | 意味 |
---|---|
\033[1m |
ハイライト(太字) |
\033[4m |
下線 |
\033[5m |
点滅 |
\033[7m |
文字色と背景色を入れ替える |
\033[0m |
デフォルトに戻す |
自分の環境(MacOS, iTerm2)では点滅はうまく動作しませんでした。
文字色
文字コード | 意味 |
---|---|
\033[30m |
黒 |
\033[31m |
赤 |
\033[32m |
緑 |
\033[33m |
黄色 |
\033[34m |
青 |
\033[35m |
マゼンダ |
\033[36m |
シアン |
\033[37m |
白 |
\033[39m |
デフォルトに戻す |
背景色
文字コード | 意味 |
---|---|
\033[40m |
黒 |
\033[41m |
赤 |
\033[42m |
緑 |
\033[43m |
黄 |
\033[44m |
青 |
\033[45m |
マゼンダ |
\033[46m |
シアン |
\033[47m |
灰 |
\033[49m |
デフォルトに戻す |
- 色を変化させた後はデフォルトに戻すのを忘れないようにしましょう。
-
出力結果の画像を貼るのが面倒だったのでサンプルコードはありません。
まとめ
エスケープシーケンスの動作は環境に依存する場合が多いので、その点は注意してください。
エスケープシーケンスを使ってイケてるテストを書きたいですね。
参考文献
以下のサイトを参考にしました