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
C言語での引数の省略方法
C言語・C++・C#
-
5
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
6
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
7
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
8
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
9
c言語でのカーソル移動(?)について
C言語・C++・C#
-
10
#define _CRT_SECURE_NO_WARNINGS について
C言語・C++・C#
-
11
C言語 exitの使い方
C言語・C++・C#
-
12
charからLPTSTRへの変換方法
C言語・C++・C#
-
13
Run-Time Check Failure #3というエラーが出ます。
C言語・C++・C#
-
14
define で 配列
C言語・C++・C#
-
15
戻り値で構造体を返すことは可能でしょうか?
C言語・C++・C#
-
16
C言語でBMPファイルの内容を表示 その2(Unix使用)
C言語・C++・C#
-
17
10個出力で改行したいのですが・・・
C言語・C++・C#
-
18
fprintfで文字化け
C言語・C++・C#
-
19
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
20
enumの値から定義名を文字列化したい
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
カレンダーのプログラムについて
-
4の倍数を論理演算で表す。。
-
【C言語教えてください】sin波...
-
CTRL+Dでループを抜けるには
-
C言語です このプログラミング...
-
じゃんけんゲームをつくったの...
-
printf( " %2d", p * q );
-
defineで定数が置き換えられな...
-
printf で二進表示を行いたい。
-
一番大きい奇数を表示する
-
万年カレンダーのC言語プログラ...
-
両替プログラムなど
-
C言語初心者です。次の問題で質...
-
C言語です
-
困ってます!Cプログラミングに...
-
(C言語)めちゃくちゃな値にな...
-
TeraPadの設定方法
-
じゃんけんゲームの応用
-
C言語のじゃんけんゲームのプロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について
-
printf で二進表示を行いたい。
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
テキストカーソル位置の取得
-
strcmp
-
unsigned int型について
-
c言語でAからZまでを表示する...
-
printf( " %2d", p * q );
-
コマンドラインに出力した文字...
-
printfの出力内の文字をdefine...
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
小数点切捨て表示
-
【C言語教えてください】sin波...
-
switch分のケースを範囲数?に...
-
二つの整数値の大小比較
-
4の倍数を論理演算で表す。。
-
defineで定数が置き換えられな...
おすすめ情報