• ベストアンサー

テキストカーソル位置の取得

C言語でテキストカーソル位置の取得をしたいのですがどうしたらよいでしょうか?   printf("\x1B[6n\n); で   ^[[24;9R のようにカーソル位置を表示できることまではわかったのですが、 これをどう加工して、変数に取得できるでしょうか? sprintf?,scanf? よろしくお願いします。

noname#27709
noname#27709

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

  • ベストアンサー
  • route156
  • ベストアンサー率85% (93/109)
回答No.2

 エスケープ・シーケンスはコンソールデバイス(画面出力/キー入力デバイス)が処理していますので、printf() つまり stdout に出力しないと動作しません。  また、stdout に "\x1B[6n" を出力すると、コンソールデバイスは現在のカーソル位置を stdin に "\x1B[yy;xxR" の形式で返しますから、結果は当然 stdin から読まなければなりません。  sprintf(buff, ...) で buff にエスケープ文字列を書き込んでも、コンソールデバイスには何の指令も届きませんから、printf(...), fprintf(stdout, ...), puts() など stdout に出力する関数を使用してください。  結果の文字列を受け取る場合も同様です。gets() など stdin から入力する関数を使います。  sscanf(buff, ...) を使うのでしたら、buff にはコンソールデバイスから返される文字列が事前にセットされいなければなりません。 #include <stdio.h> void main(void) {  char buff[16];  int cursor_x, cursor_y;  printf("%s", "\x1B[6n");  gets(buff);  sscanf(buff, "\x1B[%d;%dR", &cursor_y, &cursor_x);  printf("x = %d, y = %d\n", cursor_x, cursor_y); }  もっと簡単にするのなら buff を使わずに直接 stdin から読み込みます。 #include <stdio.h> void main(void) {  int cursor_x, cursor_y;  printf("%s", "\x1B[6n");  scanf("\x1B[%d;%dR", &cursor_y, &cursor_x);  printf("x = %d, y = %d\n", cursor_x, cursor_y); }  確かに No.1 のものは、説明のためとはいえ冗長過ぎましたね。

noname#27709
質問者

お礼

そっか、画面に出力しないと行けないのですね。納得しました。 コードの方もお見事ですね! 使わせていただきます。m(__)m 余計なゴミを出力しないといけないと思ったんですが、 エスケープシーケンスでうまく消せばいんですね! やってみます! 助かりました。ありがとうございます!

その他の回答 (1)

  • route156
  • ベストアンサー率85% (93/109)
回答No.1

 エスケープ・シーケンスですね。例えば次のようになると思います。 #include <stdio.h> #include <stdlib.h> #include <string.h> void main(void) {  char buff[16];  int cursor_x, cursor_y;  printf("%s", "\x1B[6n");  gets(buff);  cursor_y = atoi(strchr(buff, '[') + 1);  cursor_x = atoi(strchr(buff, ';') + 1);  printf("x = %d, y = %d\n", cursor_x, cursor_y); } ※ 左上隅の座標は 0, 0 ではなくて 1, 1 になります。 ※ サンプルを走らせると x は必ず 1 になりますが、これはコマンドとして実行したためです。(実行のために Enter キーを押すと、カーソルは左端に移動しますから) ※ Borland C でしたら、#include <conio.h> で int wherex(void) と int wherey(void) が使えるはずですので、そちらの方が簡単でしょう。(MS-DOS の場合ですが)

noname#27709
質問者

お礼

こんにちは。ご回答ありがとうございます! 実際に動かしてみましたが、いや~、お見事ですね。 しっかりと動きました。採用させてもらいます。 ありがとうございました。 さて、私の考えていたアプローチでもやってみたんですが、 どうもうまくいきませんでした。 x = 0, y = 0 となってしまいます。 どなたか原因わかる方いらっしゃらないでしょうか? よろしくお願いします。 -- #include <stdio.h> void main(void) { char buff[16]; int cursor_x, cursor_y; sprintf(buff, "%s", "\033[6n"); sscanf(buff, "[%[^;];%[^R]R", &cursor_y, &cursor_x); printf("x = %d, y = %d\n", cursor_x, cursor_y); }

関連するQ&A

  • テキストボックスのカーソル位置の取得・設定方法

    VisualBasic Ver.6 SP5 を使用しています。 質問タイトルのとおり、テキストボックスコントロールのカーソル位置を取得したり、設定したりすることは可能でしょうか? 調べてもわかりませんでした。 どなたかご教授ください。 よろしくお願い申し上げます。

  • 画面上のカーソルの位置を取得(VB)

    教えて下さい。 開発環境:VB2008 作成した画面上に、Aテキスト、Bテキストという2つのテキスト入力エリアがあり、それぞれ 仕入先コード、品目コードを入力する形となっています。 但し、それぞれのデータ件数が多い事から、ハンド入力が難しく、もう1つ別のフォームを作成し、 別のフォームでテーブルから検索された結果を、そのもとのフォームの入力エリアに返したいと 考えています。 そこで、画面の下部に検索ボタンを設け、Aテキストにカーソルがある状態で検索ボタンを押された 場合は、仕入先マスタ検索のフォーム、Bテキストにカーソルがある状態で検索ボタンが押された場合は、 品目マスタの検索へというように、カーソルの位置で開くフォームを変えたいと考えています。 画面上のどちらのテキストが選択されているか?を取得するような事は可能なのでしょうか? 初歩的な質問で申し訳ありませんが、教えて下さい。

  • カーソルで取得した項目のサイズについて質問です。。

    カーソルで取得した項目のサイズについて質問です。。 SELECTした項目のサイズが下記の場合、 レコード格納変数.Cの最大サイズは(14)で、それ以上のバイト数値を代入すると エラーになると思ったのですが、エラーになりませんでした。(最大28バイトになった) レコード格納変数の取得した項目サイズは何で決まってくるのでしょうか? この項目を別テーブルのVARCHAR(20)の項目へ設定しようと思っているのですが、 理由がわからないので、このままでいいのか、サイズを考慮した設計にするべきか困っています。 <oracle 9i> TABLE1{A VARCHAR2(4), B VARCHAR2(10)} DECLARE  CURSOR カーソル変数 IS SELECT A||B AS C FROM TABLE1;  レコード格納変数 カーソル変数%ROWTYPE; BEGIN  OPEN カーソル変数  LOOP   FETCH カーソル変数 INTO レコード格納変数;   EXIT WHEN カーソル変数%NOTFOUND;    :    レコード格納変数.C := VARCAHR2(15) --代入可能?    :    INSERT 項目1 VARCHAR(20) TABLE2 レコード格納変数.C;    :  END LOOP  CLOSE カーソル変数 END;

  • C言語(条件処理)

    二つの球の接触を判断するプログラムを作るという宿題が出されてたのですが、if文による条件処理をどのように書けば良いか分かりません。お助けください。 接触パターンはいくつかあると思いますが、その接触するときの条件について以下のソースコードより後、どんなソースコードを追加すれば良いか教えてもらえませんか? 接触する条件を記述するだけでも良いので回答のほうを至急、お願いします。 何か間違っていれば修正のほうもお願いします。 ソースコード #include<stdio.h> int main(void) { float x1,y1,z1; //x1,y1,z1は球1の中心の位置座標 float x2,y2,z2; //x2,y2,z2は球2の中心の位置座標 //例えば(3,0,0)であれば球の中心がx軸に3の位置にいることを指す。 float r1; //球1の半径 float r2; //球2の半径 printf("x1="); scanf("%f",&x1); printf("y1="); scanf("%f",&y1); printf("z1="); scanf("%f",&z1); printf("r1="); scanf("%f",&r1); printf("x2="); scanf("%f",&x2); printf("y2="); scanf("%f",&y2); printf("z2="); scanf("%f",&z2); printf("r2="); scanf("%f",&r2); この部分の追加をお願いします。 if(){ printf("接触した"); } else{ printf("接触していない"); } return 0; } もしくは r1とr2を入力ではなく、初期化したほうが良いのでしょうか?・・・ そうであれば、修正のほうもお願いします。

  • textareaの指定位置へカーソルを移動する

    お世話になっております。 textarea(テキストアリア)をエディターの様に加工しています。 javascriptでtextarea(テキストアリア)内の総行数と行番号を取得して、 textfield(テキストフィールド)に表示しています。 逆に、textfield(テキストフィールド)に行番号を入力してEnterキーを押下した時に 指定した行番号の位置(textarea内)にカーソルを移動したいのですが、 そのようなことは出来ますか? できるとしたら、どのように記述すればよいでしょうか? 参考になるコードまたはページ等ありましたら、教えてください。 宜しくお願い致します。

  • 次のプログラムは、n個の中からr個とる組み合わせが何通りあるか求め出力

    次のプログラムは、n個の中からr個とる組み合わせが何通りあるか求め出力するものである。 ただしこの組み合わせは次のようにけいさんするものである nCr=n!/r!×(n-r)! ○の中にあてはまる数値や文字を教えてください C言語です #include<stdio.h> void main(void) { int a,b,n,r,cnt; int kumiawase; a=○; b=1; printf("n=10"); scanf("%d",&n); printf("r=3"); scanf("%d",&r); for(cnt=n;cnt>1;cnt--){ a=○; } for(cnt=r;cnt>1;cnt--){ b=b*cnt; } for(cnt=○;cnt>1;cnt--){ b=b*cnt; } kumiawase=○/○ printf("%d個から%d個とる組み合わせ=%d\n",n,r,kumiawase); }

  • C言語、ポインタについて。

    C言語初心者です。"やさしいC"などの入門書を呼んでいて「ポインタ」につまづきました。 別書を買ったり、サイトを見たりしたのですが、理解できませんでした。 "やさしいC"からの引用なのですが、 正: #include <stdio.h> int add(int *x1,int *x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(&n1,&n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int *x1, int *x2,int a){ *x1+=a; *x2+=a; } 誤: #include <stdio.h> int add(int x1,int x2,int a); int main (void){ int n1,n2,a,ans; printf("2科目分の点数を入力してください。\n"); scanf("%d",&n1); scanf("%d",&n2); printf("加算する点数を入力して下さい。\n"); scanf("%d",&a); ans = add(n1,n2,a); printf("%d点加算しましたので\n",a); printf("科目1は%d点となりました。\n",n1); printf("科目2は%d点となりました。\n",n2); } int add(int x1, int x2,int a){ x1+=a; x2+=a; } この2つの違いはなんでしょうか。 アドレスか、そうでないか、という違いはわかりますが、なぜ"誤"のコードだと正しく処理されないのかがわかりません。 教えてください、お願いします。 (「やさしいC」の回答より引用)

  • C言語 どこがコンパイルエラーか解りません。

    いつも大変お世話になっております。 標記の件。 どこがエラーなのか解りません。 2時間くらい、にらめっこが続いています。 どこがエラーなのか教えて下さい。 ご回答のほどよろしくお願い申し上げます。 コード #include <stdio.h> int a = 0; void func(void) { int c = 2; printf("func関数では変数aとcが使えます。¥n”); printf("変数aの値は%dです。\n",a); /*printf("変数bの値は%dです。\n",b);*/ printf("変数cの値は%dです。\n",c); } int main(void) { int b = 1; printf("main関数では変数aとbが使えます。\n"); printf("変数aの値は%dです。\n", a); printf("変数bの値は%dです。\n", b); /*printf("変数cの値は%dです。\n", c); */ func(); return 0; } コンパイルエラー printf("func関数では変数aとcが使えます。¥n”); ^ text10.c:9:8: error: missing terminating " character printf("func関数では変数aとcが使えます。¥n”); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ text10.c:10:34: error: expected ')' before ';' token printf("変数aの値は%dです。\n",a); ^ text10.c:10:1: warning: passing argument 1 of 'printf' makes pointer from integer without a cast [-Wint-conversion] printf("変数aの値は%dです。\n",a); ^~~~~~ In file included from text10.c:1:0: c:\mingw\include\stdio.h:454:38: note: expected 'const char *' but argument is of type 'int' _CRTIMP __cdecl __MINGW_NOTHROW int printf (const char *, ...); ^~~~~~ text10.c:13:1: error: expected ';' before '}' token } どうかよろしくお願いいたします。

  • 組み合わせ

    aに100、bに20や2を入力すると プログラムが停止します。 計算できるように御指摘お願いします。 以下のプログラムです。 #include<stdio.h> int factrical(int n){ if(n>0){ /*printf("%d\n",n);*/ return (n*factrical(n-1)); } else{ return(1);} } int combination(int n ,int r){ return(factrical(n)/(factrical(n-r)*factrical(r))); } int main (void){ int a,b,c; printf("二つの数を入力してください。\n"); do{ printf("大きい方の数を入力してください。\n"); scanf("%d",&a); scanf("%d",&b); }while(a<b); c=combination(a,b); printf("%d",c); return(0);}

  • ウィンドウ起動時のカーソル位置について

    お世話になります。 OS:Windows Vista 言語:Visual C++ 2005 で開発しています。 TabControlを配置し、その中にTextBoxを配置した ウィンドウを開きます。 その時、最初に位置付くカーソルが Tabではなく、TabControl内のTextBoxにすることは可能でしょうか? TabIndexの順番をTextBox=0 TabControl=1にしてウィンドウを 起動しても最初のカーソル位置はTabControlに 位置付けられてしまいます。 以上、よろしくお願い致します。