質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

Q&A

解決済

3回答

1378閲覧

C エスケープシーケンス

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

0グッド

0クリップ

投稿2021/07/22 15:55

編集2021/07/28 03:24

実現したいこと

エスケープシーケンスを使用して、A, B, Cそれぞれに文字カラーをつけたい。
A Red
B Blue
C Yellow

使用環境

MacOS Big Sur
terminal バージョン2.11
gcc -v Homebrew GCC 11.1.0_1

###困っていること
エスケープシーケンスを使用して、A, B, Cそれぞれに文字カラーをつけたいのですが、それぞれの文字に対してカラー指定する方法が分かりません。
下記のコードでは、文字を指定せずにA,B,C全ての文字が赤になるように出力しています。

C

1 2#include <stdio.h> 3#include <stdlib.h> 4#include <time.h> 5int main(void) 6 { 7 srand((unsigned int)time(NULL)); 8 9 char *chars[] = {"A", "B", "C"}; 10 11 for(int i=0; i<10; i++) 12 { 13 printf("\e[31m%c", chars[ (rand()%3) ] ); 14 printf("\n"); 15 } 16 return 0; 17 } 18

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/07/22 16:01

使用しているterminalはエスケープシーケンスに対応しているのですか?
退会済みユーザー

退会済みユーザー

2021/07/22 16:16

こんばんは 対応しています。
dodox86

2021/07/22 19:01

先の以下のご質問からの流れだと思いますが、 [C エスケープシーケンスのファイル出力] https://teratail.com/questions/348718 エスケープシーケンスは各文字に色を付けるというよりは「このエスケープシーケンスをターミナル上に出力したら、それ以降はその設定(色)で出力する」と言うようなものなのですが、その辺りのご認識は合っているでしょうか。
退会済みユーザー

退会済みユーザー

2021/07/22 23:32

はい、それについては解決しています。
guest

回答3

0

\e[31m31の部分が色を示します。

それぞれの文字に対してカラー指定する方法が分かりません。

はちゃんとできています。赤だけを指定しているので、全部赤なだけです。
文字ごとに異なる数字を出力すればそれぞれの色が付きます。

あとは、最後に、\e[mを指定しないとプロンプトの文字の色まで変わってしまいますね。

投稿2021/07/22 23:07

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/25 16:32

ご回答有難うございます。
guest

0

規格上はないかも知れませんが、gccであったり各ユーティリティで普通に \e が使えたりするので、まあどちらでも良いのではないでしょうか。
参考: https://gcc.gnu.org/onlinedocs/gcc/Character-Escapes.html

すいません。epistemeさんへのコメントとして書くつもりが、回答になってしまいました。
折角なので、参考になりそうなページを挙げます。

https://qiita.com/PruneMazui/items/8a023347772620025ad6#%E5%87%BA%E5%8A%9B%E8%89%B2%E3%81%AE%E5%A4%89%E6%9B%B4

\e[3〇m ( 〇=0~7 ) で色指定して、色付き部分の文字列を出力後、\e[0m で元に戻す、を繰り返せば良いように思います。

投稿2021/07/22 16:38

編集2021/07/22 16:43
angel_p_57

総合スコア1681

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/25 16:32

ご回答有難うございます。 参考にさせて頂きます。
guest

0

ベストアンサー

エスケープ文字は(\eじゃなく) \x1b では?

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5int main(void) 6 { 7 srand((unsigned int)time(NULL)); 8 9 char *chars[] = {"A", "B", "C"}; 10 11 for(int i=0; i<20; i++) 12 { 13 printf("\x1b[37m\x1b[3%dm : ", i%8); 14 printf("\x1b[3%dm%c", i%8, *chars[ (rand()%3) ] ); 15 printf("\n"); 16 } 17 printf("\x1b[37m"); 18 return 0; 19 }

[追記] \e は 0x1b なのね... んでもコレ非標準なんで Visual C++ では失敗する...

投稿2021/07/22 16:26

編集2021/07/23 07:26
episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/22 16:47 編集

どちらでも出力結果は同じかと思います。 \eはESCを表す特殊文字として使用しています。
episteme

2021/07/22 21:42

追記しました
退会済みユーザー

退会済みユーザー

2021/07/25 16:31

無事解決することができました。 有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問