

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

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 の場合ですが)
こんにちは。ご回答ありがとうございます!
実際に動かしてみましたが、いや~、お見事ですね。
しっかりと動きました。採用させてもらいます。
ありがとうございました。
さて、私の考えていたアプローチでもやってみたんですが、
どうもうまくいきませんでした。
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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
(C言語)めちゃくちゃな値にな...
-
C言語でマウス入力(クリックや...
-
5×5の転置行列を求めるC言語の...
-
wsprintfの書式制御文字列につ...
-
C言語の勉強しています。すみま...
-
ブラックジャック
-
至急教えてください!プログラ...
-
C言語について
-
C言語
-
C言語 配列の構造体を下位関数...
-
Cのdoubleの浮動小数点表示につ...
-
C言語 プログラミング
-
scanfに文字が入力されたときに...
-
配列プログラムのバグ
-
コマンドプロンプトがすぐ消える
-
C言語の質問です if(a[0]>a[1]&...
-
クイックソートのプログラムを...
-
C++
-
C言語に関する質問です
-
c言語のフローチャートについて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
c言語でAからZまでを表示する...
-
(C言語)めちゃくちゃな値にな...
-
コマンドラインに出力した文字...
-
コンパイルエラーについて
-
コマンドプロンプトがすぐ消える
-
勝率をプログラムに
-
テキストカーソル位置の取得
-
三角形の判別
-
【C言語教えてください】sin波...
-
4の倍数を論理演算で表す。。
-
C言語で、「自然数nを入力し、n...
-
入力したお金の金額からお札の...
-
cshの文字列操作(0埋め)
-
switch分のケースを範囲数?に...
-
scanfに文字が入力されたときに...
-
プログラミングについての質問です
-
unsigned int型について
-
ダブルポインタで2次元配列を作成
-
円の面積を求めるプログラミン...
おすすめ情報