• ベストアンサー

\x1bが働きません。

\x1bが働きません。 すみません。C言語初心者でよくわかりません。 コンパイラはフリーのBorland C++ Compiler 5.5を使用してます。 OSはWindows98です。 記述は下記のとおりですが、 ------------------------------------------------------ #include <stdio.h> #include <conio.h> void main(void); void main(void) {   int i;   printf("clear\x1b[2J\n");   for(i=30;i<=37;i++){     printf("\x1b[%dmcolor\n",i);   }   getch(); } ------------------------------------------------------ DOS窓の実行画面はこのとおり。全部白文字で出力されます。 ------------------------------------------------------ clear←[2J ←[30mcolor ←[31mcolor ←[32mcolor ←[33mcolor ←[34mcolor ←[35mcolor ←[36mcolor ←[37mcolor (getchの入力待ち) ------------------------------------------------------ 実際は←の所はEnterキーに印刷されているカギ状の矢印です。 \x1bが改行マーク?に置きかえられているのです。 どなたかアドバイスお願いします。 ちなみにDOS窓の時に\が「む」キーを押さないと入力できませんが 何か関係がありますか?

  • vide
  • お礼率59% (101/170)

質問者が選んだベストアンサー

  • ベストアンサー
  • alfeim
  • ベストアンサー率58% (114/195)
回答No.4

申し訳ない、adddevではなくてadddrvでした(^^; それで組み込み方ですが、Windows95/98(se含む)であればWindowsのインストールされているドライブの一番上(普通はC:\です)にある、config.sysを編集します。 メモ帳などで開き、適当な個所に DEVICE=C:\WINDOWS\COMMAND\ANSI.SYS と記述します(C:\WINDOWS...の部分はそちらのシステムのANSI.SYSの場所を指定してください)。 NTや2000などの起動時にデバイスドライバをロードする機構を持たないものの場合は、adddrvを使います。ロードするデバイスをconfig.sysと同様に記述し adddrv [ロードするデバイスを記述したファイル名] として実行すればロードされるはずです。 ドライバがロードされたかどうかは MEM /D で確認できたはずです(このへん自信ないです。当時はサードパーティ製の別コマンド使っていたので) # 以下 駄文です ・・・さすがに最近はこのへんの事も必要なくなったせいで情報も見つかりにくくなってるようです。MS-DOS全盛の頃は知ってて当然に近い事だったのですが・・・ 要するにMS-DOS時代の知識ですので、大きな書店に行ってMS-DOS系の本を探せばこのへんの事について詳しく載っています。 また、adddrvの方は設定ファイルいらずのものがVectorにあったはず・・・なんですがX68000版は検索でヒットするけど、MS-DOS版は見当たらず・・・なくなったようです・・・ とおもったらadddevという同等コマンドがあった模様。参考URLにあります。これを使えば設定ファイル無しで読み込む事が出きるようです。

参考URL:
http://www.vector.co.jp/soft/dos/writing/se002001.html?l
vide
質問者

お礼

詳しい説明ありがとうございました。 さっそくWin98の例をとってconfig.sysを編集してみました。 はじめ何も変わらなかったので、あれ?と思ったのですが 「あっ再起動してない」と思って再起動したら バッチリの実行結果が表示されました。 1人ではとても解決できなかったでしょう。 本当にありがとうございました。

その他の回答 (3)

  • alfeim
  • ベストアンサー率58% (114/195)
回答No.3

たしかescape sequenceを通すためにansi.sysをロードしてやる必要があったと思います。 adddevコマンドでansi.sysをロードするか、config.sysでansi.sysを組み込んでから実行してみてください。

vide
質問者

お礼

ええと、なんか私の求めていた答えがここにある!と言う感じがしてます。 ありがたいです。 でも、言ってることが私には難しいです。 調べて見ましたらansi.sysっていうファイルはマシンの中に2つ、 config.sysというのは4つありました。必要なファイルは手元に あるという事でしょうか? 「adddevコマンドでロードする」「config.sysで組み込んでから」 …すみません。意味がわかりません。 何をしたら良いのでしょう? --------------------------------------------------------- p.s. 回答No.1に対する補足の中の3行目、 printf("\x1b35mピンク"); は、 printf("\x1b[35mピンク"); の誤りです。 million-showさん、失礼いたしました。

  • wogota
  • ベストアンサー率42% (66/154)
回答No.2

エスケープシーケンスを使って画面を消したり、色を変えようと なさっていると思いますが、DOSプロンプトでは出来なかった ような気がします。MS-DOSとかPC-DOSでは使えますが・・・ あと、「む」で「¥」が表示されるのは、お使いのキーボードを Windowsが英語版のキーボードと認識している、と思われます。

vide
質問者

お礼

そうそうエスケープシーケンス(制御文字)とかいうやつです。 有力な情報ありがとうございます。 しかし私にはさらなる疑問が… PC-DOSってはじめて聞きました。これって何ですか? あとWindows上ではキーボードは正常に動作してますが、 DOS窓とWin終了後のMS-DOSモードどちらともキーボードの認識が おっしゃるように誤認しているようです。 DOS上のキーボードの認識を改める方法ってあるんでしょうか?

回答No.1

すみません。私の日本語能力が低いので videさんが何を言わんとしているかがわからないのですが 改行をしたいのですか? 改行は \n と入力してください。 そうではなく、 \x1b と実行画面で表示させたいのなら、 \\x1b と\を2回続けて入力してください。

vide
質問者

補足

簡単に言うと私の狙いとしては、 printf("\x1b[2J"); /* 画面をクリアする */ printf("\x1b35mピンク"); /* "ピンク"という文字をピンク色で表示する */ なので期待する実行画面は ------------------------------------ ピンク(←ピンク色で) ------------------------------------ とやりたいのですが 現状ですと ------------------------------------ ←[2J←[35mピンク(←白色で) ------------------------------------ となってしまい期待通りの実行結果が得られないので どなたか良きアドバイスを!!ということです。

関連するQ&A

  • なぜに0が表示されるの?

    キー入力を調べるために以下の プログラムを作成したのですが・・・ #include <stdio.h> #include <stdlib.h> #include <conio.h> int main(void) { int inkey = 0; while (1) { inkey = getch(); if (inkey == 0x1b) { break; } printf("%d %x\n", inkey); } } ↑↓→←とかのキーは、 変数inkeyの値を表示する前に、 0 0と表示されます。 なぜなんでしょうか? ほかのキーでは、普通に表示されます。 教えてください。

  • C言語プログラム

    したのプログラムでgetch()の代わりにscanf()を使って、入力した数が負なら終了、正なら"次の数を入力してください"と表示してループを続けるプログラムを作りたいのですが、どこを変えればよいのですか? #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c='m'; while(c!='e')//eでない限りwhileループを実行する { sum=sum+i; printf("\n1 kara %d madewo tasuto %d desu.\n",i,sum); i++; printf("nanikakeywo oshitekudasai.owaru tokiha 'e'\n"); c=getch(); } printf("loopwo nukemashita\n"); getch(); }

  • C言語(while構文)

    #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c='m'; while(c!='e')//eでない限りwhileループを実行する { sum=sum+i; printf("\n1 kara %d madewo tasuto %d desu.\n",i,sum); i++; printf("nanikakeywo oshitekudasai.owaru tokiha 'e'\n"); c=getch(); } printf("loopwo nukemashita\n"); getch(); } getch()の代わりに、scanf()を使って整数値を入力させ、負の数が入力されたら終了するプログラム(正を入力したら「次の数値を入力せよ」とだして、繰り返す。)を造りたいのですが、どこを変えればよいか教えてください。

  • \x1bを使ったswitch文が反応しない

    int main(void){ int n; while(1){ menu(); scanf("%d", &n); switch(n){ case 1 : printf("\x1b[6;10H%s", "メニュー1を実行します"); break; case 2 : printf("\x1b[6;10H%s", "メニュー2を実行します"); break; case 3 : printf("\x1b[6;10H%s", "メニュー3を実行します"); break; default : printf("\x1b[6;10H%s", "指定数字ではありません"); break; } } return 0; } void menu(void){ printf("\x1b[2J"); printf("\x1b[3;10H%s", "メニュー1"); printf("\x1b[4;10H%s", "メニュー2"); printf("\x1b[5;10H%s", "メニュー3"); } コンパイルは通るのですが、数字を入力しても反応が無くwhile(1)の繰り返しが続くだけになってしまいます。これはどこか問題あるでしょうか?

  • C言語でタイミングを合わせるゲームを作っているのですが・・・。【getch()】

    C言語で壁に向かって衝突していくボールをタイミングよくスペースキーを押すことで打ち返すプログラムを作っています(多分実行しないと分かりにくいかも)。 そこでキーの入力にgetch()関数を使っていますが、これだと何かキーが入力されるまで永遠と待ち続けてしまうので、タイミングが100%合ってしまいます。 そこで指定された秒数だけキーの入力を受け付けるような方法を探しているのですが、そのようなものはあるのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <windows.h> int main(void){ int key=0,ballichi=0,i,i2; system("cls");//画面の初期化 for(i=0;i<10;i++){ for(i2=0;i2<10;i2++){ if(ballichi==i2){printf(" o"); }else{printf(" ");} } printf("|壁"); if(i==9){ key = getch(); //キーから一文字入力 switch (key) { /* キー入力チェック */ case ' ': printf("スペースキーが押されました"); break; } } Sleep(500); ballichi++; system("cls"); } return 0; }

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • 中央値の抽出

     printf("\n中央値は%7.1fです。\n",median);の部分で%7.1fの7.1というのはどんな意味があるのでしょうか? #include<stdio.h> #include<conio.h> void main() { int d[100]; int i,j,n,temp,n_med; float median; printf("データ数を入力してください。(最大100); "); scanf("%d",&n); for(i=0;i<n;i++){ printf("%d番目のデータは? ",i+1); scanf("%d",&d[i]); } for(i=0;i<n;i++){ for(j=i+1;j<n;j++){ if(d[i]<d[j]){ temp=d[i]; d[i]=d[j]; d[j]=temp; } } } n_med=n/2; if(n==n_med*2){ median=(float)(d[n_med-1]+d[n_med])/(float)2; } else{ median=d[n_med]; } printf("\n中央値は%7.1fです。\n",median); getch(); }

  • c言語

    #include<stdio.h> #include<conio.h> void main() { int i=1,sum=0; char c=\'m\'; while(c!=\'e\')//eでない限りwhileループを実行する { sum=sum+i; printf(\"\\n1 kara %d madewo tasuto %d desu.\\n\",i,sum); i++; printf(\"nanikakeywo oshitekudasai.owaru tokiha \'e\'\\n\"); c=getch(); } printf(\"loopwo nukemashita\\n\"); getch(); } while(c!=\'e\')をwhile(c>0)にして実行したい場合はcharをintにかえて、scanfを使わなければならないのはわかりますが、どこを変えればよいか分かりません。ちなみに、while(c>0)に変えた場合に、正の数を入力した後に、「次の数を入力してください」という文を表示してからくりかえす方法をおしえてください。

  • 矢印キーの反応が悪くなります

    このコードをmain関数とキーコントロール関数とに分けたところ、 キーのレスポンスがわるくなりました。 このソースコードをどのように分割すれば一つのファイルで書いたように、 動いてくれるのかわかりません。 よろしくお願いします。 /* 分割前のソースコード */ #include <stdio.h> #include <conio.h> int main(int argc, char *argv[]){ int key=0; while(key!='q'){ //終了キー 'q' key=_getch(); //Keyによって分岐 switch((key == 0x00 || key == 0xe0) ? _getch(): key) { case 0x48:printf("上");break;//上 case 0x50:printf("下");break;//下 case 0x4b:printf("左");break;//左 case 0x4d:printf("右");break;//右 default:break; } } return 0; } /*--ここから下が分割してみたソースコード---*/ /* arrowkey.h */ #ifndef ARROWKEY_H #define ARROWKEY_H int arrowkey(void); #endif //ARROWKEY_H /*---------------------------------*/ /* arrowkey.c */ #include <stdio.h> #include <conio.h> #include "arrowkey.h" int arrowkey(void){ int key=_getwch(); //Keyによって分岐 switch((key == 0x00 || key == 0xe0) ? _getch(): key) { case 0x48:printf("上");break;//上 case 0x50:printf("下");break;//下 case 0x4b:printf("左");break;//左 case 0x4d:printf("右");break;//右 case 0x71:break;//終了 default:break; } return key; } /*---------------------------------*/ /* main.c */ #include "arrowkey.h" int main(int argc, char *argv[]){ int key=0; while(key!='q'){ //終了キー 'q' key=arrowkey() } return 0; }

  • c言語です。

    c言語です。 実行結果 式 3 X1 + 2 X2 + 1 X3 = &g 2 X1 + 5 X2 + 2 X3 = &g 1 X1 + 4 X2 + 1 X3 = &g 解 X1 = 1 X2 = 2 X3 = 3 を 式 3 X1 + 2 X2 + 1 X3 = 10 2 X1 + 5 X2 + 2 X3 = 18 1 X1 + 4 X2 + 1 X3 = 12 解 X1 = 1 X2 = 2 X3 = 3 に直したいのですが&gの所をどのようにしたら10.18.12になりますか? #include <stdio.h> #include <float.h> #define N 3 double A[N][N] = {{3,2,1}, {2,5,2}, {1,4,1}}; double b[N] = { 10, 18, 12 }; void Gauss_J( int, double*, double* ); void main(void) { int i; printf( "%d式\n", N ); for( i = 0; i < N ; i++ ) { printf( "%g X1 + %g X2 + %g X3 = &g \n", A[i][0], A[i][1], A[i][2], b[i] ); } printf("解\n"); Gauss_J(N, (double *)A, (double *)b ); printf("X1 = %g \n", b[0]); printf("X2 = %g \n", b[1]); printf("X3 = %g \n", b[2]); } void Gauss_J(int n, double *a, double *b) { int p, i, j,I ; double pivot, c ; for ( p = 0 ; p < n ; p++ ) { pivot = a[ p*n + p ]; for ( i = p ; i < n ; i++ ) { a[ p*n + i ] /= pivot; } b[ p ] /= pivot; for ( I = 0 ; I < n ; I++) { if (I != p) { c = a[ I*n + p]; for ( j = p ; j < n; j++ ) { a[ I*n + j] -= c * a[ p*n + j ]; } b[ I ] -= c * b[ p ]; } } } return ; }