OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 困ってます
  • 質問No.224629
  • 閲覧数951
  • ありがとう数3
  • 気になる数0
  • 回答数2
  • コメント数0

C言語でテキストカーソル位置の取得をしたいのですがどうしたらよいでしょうか?

  printf("\x1B[6n\n);

  ^[[24;9R
のようにカーソル位置を表示できることまではわかったのですが、
これをどう加工して、変数に取得できるでしょうか?
sprintf?,scanf?

よろしくお願いします。
通報する
  • 回答数2
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.2
レベル10

ベストアンサー率 85% (93/109)

 エスケープ・シーケンスはコンソールデバイス(画面出力/キー入力デバイス)が処理していますので、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

余計なゴミを出力しないといけないと思ったんですが、
エスケープシーケンスでうまく消せばいんですね!
やってみます!

助かりました。ありがとうございます!
投稿日時 - 2002-03-12 14:15:33
-PR-
-PR-

その他の回答 (全1件)

  • 回答No.1
レベル10

ベストアンサー率 85% (93/109)

 エスケープ・シーケンスですね。例えば次のようになると思います。 #include <stdio.h> #include <stdlib.h> #include <string.h> void main(void) {  char buff[16];  int cursor_x, cursor_y;  printf("%s" ...続きを読む
 エスケープ・シーケンスですね。例えば次のようになると思います。

#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);
}
投稿日時 - 2002-03-11 12:01:23


このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ