前提・実現したいこと
こんばんは。今回はエスケープ・シーケンス ( / と ESC ... など ) の使用方法(コンソールに出力する際の使用方法)について質問させていただきます。
発生している問題
エスケープ・シーケンスを printf 関数などで使用する際,改行を実行したいときには
printf("test\n"); のように \n を利用して改行を行うことを学びました。また、その他にも \a や \r を利用することで警告や復帰を行うということも知りました。
このようなこともあり、エスケープ・シーケンスに該当する文字は、「続けて」 \ や ESC[ などの後に表記するものだと思っていました。
しかし、私が使用しているテキスト(新明解シリーズ)に以下のコードがあり、エスケープ・シーケンスの表記が3つの printf 関数にまたがってされており、なぜそのような表記ができるのかが分かりませんでした。
該当のソースコード
このコードは、コンソール画面の文字の色・背景色を指定するエスケープ・シーケンスである
ESC[-;-;...m を使用して、色の変更を行うコードです。(~は省略したものです。)
C
1void color(int fg, int bg) { 2 3 int col[] = { ~ }; 4 5 printf("ESC[0;"); 6 7 if (~) { 8 9 printf("1;"); 10 11 } 12 13 printf("%d;%dm", ~); 14 15}
このように、ESC[-;-;...m のエスケープ・シーケンスが複数の printf 関数に分かれて表記されていました。
上記のコードのように、エスケープ・シーケンスの表記はその後に続けて書かなくても1つのエスケープ・シーケンスの表現としてみなされるのでしょうか?それとも、それぞれのエスケープ・シーケンスで別々の箇所で表記することが可能なものや、できないものなどが決まっているのでしょうか?
ご教授して下さると幸いです。宜しくお願いします。
試したこと
私が visual studio しか持っておらず、この動作を実際に確かめようと思ったのですが、ESC などのエスケープ・シーケンスがサポートされていないため、実行することができませんでした。
エスケープ文字(\aや\n)の実行は行うことができましたが、やはりその printf 内での引数中に書かない場合はエスケープ・シーケンスとして機能せず、存在しないエスケープ・シーケンス表記を利用したとして未定義動作?となり、実行がおかしくなってしまいました。(引数の末尾に \ のみを指定した場合は "定数が 2 行目に続いています" と,エラーになりました。)
また、上記のようなコードが他にあるのかどうかや、別々に書いてもいいのかについて探してみたのですが見つかりませんでした。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/02 12:32
2018/09/02 12:46
2018/09/02 12:50
2018/09/02 12:58
2018/09/02 13:04
2018/09/02 13:35
2018/09/02 13:57
2018/09/02 15:36