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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C言語で今まで表示していた画面の消すには?
C言語・C++・C#
-
Enterキーを押されたら次の処理に移るという事をしたい。
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
#include <Windows.h>というヘッダファイルについて
C言語・C++・C#
-
8
c言語でのカーソル移動(?)について
C言語・C++・C#
-
9
#define _CRT_SECURE_NO_WARNINGS について
C言語・C++・C#
-
10
read関数をノンブロッキングで実行する(c言語)
C言語・C++・C#
-
11
C言語 exitの使い方
C言語・C++・C#
-
12
Run-Time Check Failure #3というエラーが出ます。
C言語・C++・C#
-
13
fprintfで文字化け
C言語・C++・C#
-
14
C ファイル出力で、フォルダがない場合でも作成する方法
C言語・C++・C#
-
15
戻り値で構造体を返すことは可能でしょうか?
C言語・C++・C#
-
16
define で 配列
C言語・C++・C#
-
17
10個出力で改行したいのですが・・・
C言語・C++・C#
-
18
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
19
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
20
C言語でBMPファイルの内容を表示 その2(Unix使用)
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
error C2143: 構文エラー : ';'...
-
hit&bolwのプログラミングがで...
-
困ってます!Cプログラミングに...
-
万年カレンダーのC言語プログラ...
-
C言語での、年複利の計算方法...
-
(C言語)めちゃくちゃな値にな...
-
ヘロンの公式を作ったプルグラ...
-
ブラックジャック
-
コマンドプロンプトがすぐ消える
-
勝率をプログラムに
-
平均合計偏差値標準偏差の出し方
-
C言語
-
関数について
-
printf()文の書式
-
C言語で四則演算を使って10を作...
-
if文がコンパイルエラーを起こ...
-
scanfで正しい値を入力できない
-
DOS画面でテキストカーソルの位...
-
C言語で、「自然数nを入力し、n...
-
2進数の乗算と除算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報