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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 画面上のカーソルに文字数字を入力するコードを教えて下さい 1 2022/10/30 10:31
- その他(プログラミング・Web制作) pythonでのカーソル移動がずれる 2 2023/07/30 08:51
- iPhone(アイフォーン) スマホ文字消しにくい 3 2023/07/27 15:23
- Excel(エクセル) Excelで、カーソルの移動が異常です。 1 2022/06/15 20:54
- iPad これまでタブレットは何台使ったか数え切れないほどですが、今回iPadを初めて手に入れました。 全体的 5 2022/08/07 18:34
- モニター・ディスプレイ マルチモニタでのカーソルの動き方 1 2022/06/15 14:59
- Word(ワード) Wordで破線をひくにはどうすれば良いのでしょうか。 5 2022/06/17 13:24
- PDF I LOVE PDF利用 pdfからWordに変換について 回答お願いいたします。 無料のI LOV 1 2022/05/13 13:24
- その他(パソコン・周辺機器) 一体型パソコンでペンタブを使用した際反応を正常にする方法 1 2022/04/30 12:38
- YouTube ユーチューブ 2 2022/07/21 13:22
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
C言語で今まで表示していた画面の消すには?
C言語・C++・C#
-
キャレットの現在位置の表示 (Win32API)
C言語・C++・C#
-
-
4
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
5
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
6
C言語での引数の省略方法
C言語・C++・C#
-
7
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
8
C言語 exitの使い方
C言語・C++・C#
-
9
charからLPTSTRへの変換方法
C言語・C++・C#
-
10
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
11
Run-Time Check Failure #3というエラーが出ます。
C言語・C++・C#
-
12
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
13
10個出力で改行したいのですが・・・
C言語・C++・C#
-
14
C++にてtemplateで受け取った任意の型の変数が何型であるかを判定したい
C言語・C++・C#
-
15
戻り値で構造体を返すことは可能でしょうか?
C言語・C++・C#
-
16
enumの値から定義名を文字列化したい
C言語・C++・C#
-
17
switch の範囲指定
C言語・C++・C#
-
18
c言語でのカーソル移動(?)について
C言語・C++・C#
-
19
c言語 ちらつき
C言語・C++・C#
-
20
C言語でマウス入力(クリックやホイール)をすると数字が端末に表示されるプログラムを教えてください
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語について
-
unsigned int型について
-
2の累乗を計算するプログラム...
-
strcmp
-
コマンドラインに出力した文字...
-
平均合計偏差値標準偏差の出し方
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
switch分のケースを範囲数?に...
-
WM_CLOSEで閉じれないウィンド...
-
【C言語教えてください】sin波...
-
じゃんけんゲーム
-
ifなんですが
-
C言語の勉強しています。すみま...
-
小数点切捨て表示
-
c言語でAからZまでを表示する...
-
C言語に関する質問です
-
C言語の数値入力
-
2つ分数の四則演算を行うプロ...
-
改行について 1行に何個かづ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printf で二進表示を行いたい。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
テキストカーソル位置の取得
-
10個出力で改行したいのですが...
-
cshの文字列操作(0埋め)
-
コンパイルエラーについて
-
コマンドラインに出力した文字...
-
ifなんですが
-
strcmp
-
c言語でAからZまでを表示する...
-
なぜgccはstdio.hをインクルー...
-
(C言語)西暦年月日を入力して...
-
error C2143: 構文エラー : ';'...
-
三角形の判別
-
4の倍数を論理演算で表す。。
-
printfの出力内の文字をdefine...
-
scanfに文字が入力されたときに...
-
unsigned int型について
-
C言語について
おすすめ情報