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

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

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

よろしくお願いします。

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

A 回答 (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 のものは、説明のためとはいえ冗長過ぎましたね。
    • good
    • 0
この回答へのお礼

そっか、画面に出力しないと行けないのですね。納得しました。

コードの方もお見事ですね!
使わせていただきます。m(__)m

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

助かりました。ありがとうございます!

お礼日時:2002/03/12 14:15

 エスケープ・シーケンスですね。

例えば次のようになると思います。

#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 の場合ですが)
    • good
    • 0
この回答へのお礼

こんにちは。ご回答ありがとうございます!

実際に動かしてみましたが、いや~、お見事ですね。
しっかりと動きました。採用させてもらいます。
ありがとうございました。

さて、私の考えていたアプローチでもやってみたんですが、
どうもうまくいきませんでした。
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

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

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

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

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

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

Qツールバーがカーソルを合わせないと出ない

サイトを見ている際、上部にツールバーが出ていたのですが、今ではそこにカーソルを合わせないと出なくなってしまいました。
下部のツールバー?も以前より小さくなってしまいました。
元に戻したいのですが、どうしたらよいでしょう?

Aベストアンサー

F11キーを押してください。

Q構文中の『\n』、『\n\t』について

構文中の『\n』、『\n\t』について

下記のC言語構文中の『\n』、『\n\t』の部分がどうしてもわかりません。

#define SLEEP asm volatile("sleep\n"::)
または
#define SLEEP asm volatile("sleep\n\t"::)

ご教授下さい。
よろしくお願い致します。

Aベストアンサー

『\n』は改行、
『\n\t』は改行して、(行頭に)タブを入れる。
 

Q画面立ち上げ時 カーソルが出ない

windowas meのノートを使っていました。
画面を立ち上げたら、画面の絵や文字が拡大されていて、いくら動かしてもカーソルが現れません。
今は違うパソコンからアクセスしてますが、どうしたらよいのでしょうか?
教えてください。お願いします。

Aベストアンサー

多分、レジストリトラブルでしょう!

キーボードよりウインドウズキーを押し、
方向キー(↑)で「ファイル名を指定して実行」で
エンター、scanregw /restore(scanregwの後
ワンスペース)と入力しエンター、
「レジストリの復元」画面で
方向キーで正常だった最新の日でエンター
これで再起動がかかります

修復出来ると思いますが?

Qprintf("文字列\n")が円マークなんです!!斜線がでない!!

うちのノートパソコン(IBM)OSはTurbolinux Personalと、デスクトップ(NEC)OSはWindows2000でC言語のプログラミングをすると文字が変なんです。

printf("文字列\n");

と改行のエスケープシークエンス?を入力すると円マーク(\)なんです!!

右下がりの斜線のキーを押してるのに円マーク(\)しかでないんです。二つのPCどちらでやってもです。C言語のテキストでは右下がりの斜線とnで改行のエスケープシークエンス?になっているので見ていて気持ちが悪いです・・・。

ちゃんと右下がりの斜線は出せないものでしょうか。ちなみにキーボードには右下がりの斜線が書いてあります。

プログラミング上も\nで右下がりの斜線と同じ、改行の意味で理解されているらしく、ちゃんと改行されます。

でも右下がりの斜線じゃないと気持ち悪い・・・。直せませんか?

Aベストアンサー

日本語環境だと、\で正解です。
同じ意味(文字コード)です。


\(の半角)は バックスラッシュといいます。
日本語フォントでは、歴史的な原因で \ の文字コードと同じものが割り当てられていますので、日本語フォントで表示している限り、 ¥(半角)が表示されます。


歴史的背景をここで解説すると文字数足りなくなりますので。
ここ
http://ja.wikipedia.org/wiki/%5C
や、ここ
http://ja.wikipedia.org/wiki/%E5%86%86%E8%A8%98%E5%8F%B7
を読んでください。

Qツールバーにカーソルをポイントしてもヒントが出ない

エクセルの2000を使っていますが、標準ツールバーにある「上書き保存」のマークや「切り取り」などのマークの上にカーソルを置いてもヒントが出ません。
普通だったらどんなことが出来るのか、マウスポインタの下に文字が出ますよね?
すみませんが、ご回答よろしくお願いします<(_ _)>

Aベストアンサー

ツール-ユーザー設定-オプションタブ
ツールバーにボタン名を表示する のチェックを
オンにしてみてください。

Qprintf("\a");のアラーム音

言語:c

#include <stdio.h>

int main ( void ) {
printf("\a");
return (0);
}

上記のプログラムを実行すると、
アラーム音(?)が鳴ります。

音が出ている場所がスピーカからではなくて、
PCの本体から出ているようです。

なぜスピーカから鳴らないのでしょうか。
なぜPC本体から鳴っているのでしょうか。

Aベストアンサー

環境にもよるのですが…Windowsですか?一般的なPCの場合、
スピーカからなる宇和揺る普通のサウンドの他に、BEEP音源というのがありまして。
こちらはデバイスが違うのでPC本体から直接音が鳴ります。
# 現在では、例えばシステムの異常を通知するような時くらいしか使われないかも。
で、\aにこちらが使われるのは、多分にMS-DOS時代からの歴史的な経緯じゃないかと思います。
昔はコレでも普通でしたし、
\aは「何か音がなればいい」というものであって、どんな音を鳴らすかは別に決まってないですし、
めったに使われないので綺麗なサウンドとか必要ないと思いますし、
OSがおかしくてもなる可能性がBEEPの方が高いかもしれませんし…。

Q画像にカーソルをおくと左上に出てくるものを出ないようにするタグ教えてください!

よく画像にカーソルをおくと、
画像の左上に小さくでてくるもの
(クリックすると、画像を保存できたり、
印刷出来たり、メールで添付できる4つのものです)
を、出てこなくしたいのですが
その方法(タグ等)教えて頂けますか?
宜しくお願いします。

Aベストアンサー

1ページ分の画像のイメージツールバーを非表示する場合。
<HEAD>と</HEAD>の間に入れてください。
<meta http-equiv="imagetoolbar" content="no">

imgタグに直接入力する場合は
<img src="画像のファイル名" alt="画像の説明" width="横幅" height="縦長さ" galleryimg="no">

Q&str[n]とpstr + nと&pstr[n]

あるプログラミングの本で

&str[n]
pstr + n
&pstr[n]

は同じだと書いてあり、考えたのですが、
上の二つはstr[n]のアドレスを表しているとしても、
三つ目はstr[n]のポインタのアドレスを表していると思うのですが
どこが間違っているのでしょうか?教えてください。

Aベストアンサー

>本にも突然でてきているのでよくわからないのですが・・・。

よくわからないもの同士が同じかと聞かれても、よくわからないというのが答えです。
本当に、突然出てきているのなら、そんな本は捨てましょう。

Qカーソルを近づけても表示が出ない

Microsoft Internet Explorerや、タスクバーのクイック起動アイコンにカーソルを近づけると、それが何なのか、黄色い帯の中に黒い字で表示が出ますが、Word2003, Excel2003, Outlook2003では、近づけても何も出ません。どうしたら、インターネットやタスクバーのように、表示が出るように設定できますか?

Aベストアンサー

WordやExcelのツールバーのボタンをポイントしたときに表示される吹き出しのことですね。
ユーザー設定のオプションで、「ツールバーにボタン名を表示する」のチェックが外れていると思います。チェックを付けてください。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。


人気Q&Aランキング

おすすめ情報