エスケープ・シーケンスはコンソールデバイス(画面出力/キー入力デバイス)が処理していますので、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 余計なゴミを出力しないといけないと思ったんですが、 エスケープシーケンスでうまく消せばいんですね! やってみます! 助かりました。ありがとうございます!