「dポイント」が最大20倍になるお得な情報

C言語でDOSプログラムを作っているのですが、
文字の色を変えることはできるのでしょうか?

#include <stdio.h>
void main(){
printf("あいうえお");
}

コンパイラはボーランドで、DOSはXPのものとし、
文字を赤くするとしたら上の例ならどのように
書けばよいのでしょう?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

文字をカラーで表示するには


ヘッダファイルconio.hで定義されているtextattr()を使います。
なのでconio.hをインクルードする必要があります。

色は0~15の整数値や記号で指定します。
0=BLACK
1=BLUE
2=GREEN
など。
以上をふまえると以下のようなソースになります
(緑色で表示します)
文字をカラーで表示する方法はコンパイラによって違うと聞くので試してみてください。
文字をカラーで表示するには
ヘッダファイルconio.hで定義されているtextattr()を使います。
なのでconio.hをインクルードする必要があります。

色は0~15の整数値や記号で指定します。
0=BLACK
1=BLUE
2=GREEN
3=CYAN
4=RED
5=MAGENTA
6=BROWN
7=LIGHTGRAY
など。
以上をふまえると以下のようなソースになります
(緑色で表示します)
文字をカラーで表示する方法はコンパイラによって違うと聞くので試してみてください…
#include<stdio.h>
#include<conio.h>

int main(){
textattr(2);
textattr(GREEN);
cprintf("あいうえお");
return 0;
}
    • good
    • 2
この回答へのお礼

大変わかりやすい説明をありがとうございます。
このやり方ならすぐに理解できました。
お陰でものすごく助かりました!!

お礼日時:2006/04/21 06:18

こんにちは。



昔はエスケープシーケンスを利用してやっていたものですが…。

#1の方がおっしゃる方法が簡単で良いですが、以下のようなやり方もあります。ただし、Windows の DOS 窓で実行する場合に有効な手段です。
SetScreenTextAtrribute 関数を上手く使うと、テキストの背景色なども変更できます。


#include <windows.h>
#include <stdio.h>
#include <conio.h>

int main(void)
{
HANDLE h;
CONSOLE_SCREEN_BUFFER_INFO csbi;

h = GetStdHandle(STD_OUTPUT_HANDLE); // 標準入出力へのハンドルを得る
GetConsoleScreenBufferInfo(h, &csbi); // コンソールスクリーンバッファ(現在の状態)を得る
SetConsoleTextAttribute(h, FOREGROUND_RED); // 文字色を赤に変更

printf("あいうえお\n");
return 0;
}
    • good
    • 0
この回答へのお礼

すばらしいです! ありがとうございます。
昔は確かにエスケープシーケンスで簡単にできてたみたいですね。今はもう出来ないのかと思ってました。
感謝します!。

お礼日時:2006/04/21 06:16

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語においてコマンドプロンプトで表示する時に文字の色を変えられますか?

コマンドプロンプトで文字を表示する時・・


 printf("あいうえお");

だと、コマンドプロンプトの背景は黒で表示される文字「あいうえお」は白になります。

この「あいうえお」を青色にしたり、緑色にしたりすることは可能でしょうか?

Aベストアンサー

printf("\033[31m hello world!\n");
こんな感じでしょうか?
これで、文字は赤くなります。

ところで、Windows2000以降のコマンドプロンプト環境で、ANSIエスケープシーケンスを有効にするには、それなりに工夫が要りますので、検索エンジンで調べてみてください。

Qコンソールで文字に色を付ける

コンソールで文字に色を付ける方法、Win32APIの関数をおしえてください。
また、これに対するSDKのインストール方法を教えてください。環境はVC++2005です。

Aベストアンサー

文字に色を付ける
http://www.asahi-net.or.jp/~qb3k-kwsk/rpg/program/tutorial/game1/m100.html

Visual C++ 2005 Express Edition と Microsoft Platform SDK を一緒に使う
http://www.microsoft.com/japan/msdn/vstudio/express/2005/visualc/usingpsdk/

Qコマンドプロンプトの文字に色をつける

 今晩は、Cの初心者です宜しくお願いします。
 友人に聞くとコマンドプロンプトに表示させた文字にも色をつけることが出来ると聞きました。
 エスケープシーケンスでえサイトの検索を書けたのですがヒットしません。
 宜しくお願いします。

Aベストアンサー

一例です。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1196473

Q”カラー表示プログラム”のソースコードは何を実現するものなの

以下のプログラムは ”カラー表示プログラム”であるとかいてありましたので、これを記述して color。cpp  の名前で保存してコンパイルしてから

#include <stdio.h>

main()
{
printf("\x1b[4;36mColor Sample\x1b[4;m\n");
printf("\x1b[31mRed\n");
printf("\x1b[32mGreen\n");
printf("\x1b[33mYerrow\n");
printf("\x1b[34mBlue\n");
printf("\x1b[35mMagenta\n");
printf("\x1b[36mCyan\n");
printf("\x1b[37mWhite\n");
}
以下の  color.exe  をDOSで実行しましたら次のようになりました。



"\My Documents\C\color.exe"
[4;36mColor Sample[4;m
[31mRed
[32mGreen
[33mYerrow
[34mBlue
[35mMagenta
[36mCyan
[37mWhite

てっきり、カラー表示の帯のようなものができると、思っていましたが、色番の数字と m が再現されただけでした。

 一体 これは 私の思い違いなのでしょうか?

そもそもこの”カラー表示プログラム”のソースコードは何を実現するものなのでしょうか?

 c言語はまだ始めたばかりで、つまずいてしまいました。「ひまわり」という日本語で記述できる簡単なプログラム などを参照しながら、同じようなことがないのかみてみましたが、文字色の変更、とか 色の番号を出すとかありますが、上のようなものは見当たりません。

 つまずくと、先に進むのが、億劫になります。この基礎的な(たぶん)ことを教えていただければ ありがたいのですが。ちなみにこのことが書いてあるのは、『はじめてのc言語」  秀和システム 佐々木 整 1995・9 の本です。

このテキスト画面では、 ”color.exe" の実行画面の各行の先頭がおかしく表現されますが、正しくは、
┛の左先に矢印←が付いたものです。

以下のプログラムは ”カラー表示プログラム”であるとかいてありましたので、これを記述して color。cpp  の名前で保存してコンパイルしてから

#include <stdio.h>

main()
{
printf("\x1b[4;36mColor Sample\x1b[4;m\n");
printf("\x1b[31mRed\n");
printf("\x1b[32mGreen\n");
printf("\x1b[33mYerrow\n");
printf("\x1b[34mBlue\n");
printf("\x1b[35mMagenta\n");
printf("\x1b[36mCyan\n");
printf("\x1b[37mWhite\n");
}
以下の  color.exe  をDOSで実行しましたら次のようになりま...続きを読む

Aベストアンサー

実行しているPCがDOS/Vマシンで、Windows95かWindows98(98SE含む)であれば、以下の方法で正しく色付き文字が表示されます。

1.C:\CONFIG.SYSに以下の1行を書き加える
devicehigh=C:\WINDOWS\COMMAND\ansi.sys

2.C:\WINDOWS\COMMAND\のフォルダにansi.sysと言うファイルがあるか確認する。無いなら、そのフォルダにansi.sysファイルを置く

3.PCを再起動してMS-DOSプロンプトを開く

4.color.exeを実行する

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

QEnterキーを押されたら次の処理に移るという事をしたい。

コンソールアプリケーション上で文字列を表示させた後、ユーザーがエンターキーを押したら次の文字列を表示するという仕様にしたいのですが、エンターキーだけ入力待ちにするっていうのはどのように書けばいいんでしょうか?

Aベストアンサー

#include <stdio.h>

int main(void)
{
char *str[] = {"abc", "def", "ghi", "jkl"};
int i;

for(i = 0; i < 4; i ++){
while(getchar() != '\n') ;
puts(str[i]);
}
return 0;
}

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Qfgetsなどのときのstdinのバッファを消すには?

こんにちは,今C(C++でない)を使用しています。
たとえば,
char str[20]
fgets(str,sizeof(str),stdin)
としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。

C++などでは
fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。

よろしくお願いします。

Aベストアンサー

あ,テキスト入力だからこんな大掛かりなことしなくてもいいんだ.
末尾に'\n'が出るまで掃出せばいいんですよね.

fgets(str, sizeof(str), stdin);
if ( str[strlen(str)-1] != '\n' ){
while( getchar() != '\n' );
}

でいいんだ.失礼しました.

Qscanf("%s", buf);でスペースを含んだ文字

コンソールプログラムで
scanf("%s", buf);
を使用してユーザに入力された文字によって処理を行いたいのですが、このままではスペースを含む文字列がスペースの手前で切られてしまいます。
C:\Program Filesなどを入力可能にさせたい場合にはどのようにするのがベターですか?

Aベストアンサー

お任せください!
そもそもscanfを使うというのはお勧めでは
ありません。scanfは文字+改行文字が入力
されないと完了しないためです。
が、それは良しとしましょう。
scanfの書式ですが、

int n = scanf("%[^\r\n]",buf);

という便利な書式があります。
perlでもおなじみの書式ですね。
上記の山文字"^"より前が読み込ませたい文字の集まりで、ハイフン指定が出来ます。
"^"より後ろが読込みを停止させたい文字の集まりです。上記の指定は復帰改行以外の文字が現れるまで読み込みます、という書式です。
下記のような指定も出来ます。

int n = scanf("%[a-zA-Z0-9\\: \t^\r\n]",buf);

なお、戻り値は読み込んだ項目数ですので、
if(n >= 1)
{
}
で判断できますね。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング