• ベストアンサー

コマンドラインに出力した文字を消すには

printf 関数などで出力した文字を行単位などで消したい場合,どのような操作をすればよいでしょうか. visual studio 2005を使っているのですがprintfでエスケープシーケンスを使っても,うまく文字を消すことができなかったです. 分かる方いたら教えてください.

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

エスケープシーケンスが使えないなら、恐らくWindowsのAPIを使わなくてはなりません。 GetConsoleScreenBufferInfoでコンソールのサイズなどを取得し、 ReadConsoleOutputでコンソールの内容を取得し、 不要な行を消去して、 WriteConsoleOutputで書き込めば良いはずです。 詳細はGoogleさんに聞けば、サンプルが見つかると思います。 しかし、printf等は検索結果やエラー情報など、後から消す必要の無いものを表示するためのものだと思います。 sorokukuさんがどのようなプログラムを製作中なのかはわかりませんが、無理に消す方法を探すよりも、普通のWindowsアプリにしてテキストコントロールやラベルで表示したほうが簡単だと思います。Visual C++ Expressでも.NETを使ったアプリなら作れるはずですし、Turbo C++と言う手もあります。

その他の回答 (2)

noname#144013
noname#144013
回答No.3

こんにちは。 > printfでエスケープシーケンスを使っても,うまく文字を消すことができなかったです. とありますが、具体的にどのようなコード(プログラムのソース)を書かれたのでしょうか? 差し支えなければ、その部分(文字列を出力する部分~その文字列を消去する部分)のソース (プログラムが小さければできれば全ソース)を提示して頂けないでしょうか?  その方が、回答者の方も問題を把握でき具体的なアドバイスも貰い易いかと思います。 参考までに、エスケープシーケンスを使用した文字列消去(行単位)のサンプルプログラムを 作ってみましたので、宜しければ試してみて下さい。 お使いの環境で上手くビルド及び実行できるかどうか判りませんが、多少なりともヒントになれ ば幸いに思います。 なお、本サンプルは、当方では「Windows98SE+Visual C++ 5.0」の環境で作成&実行テスト を行なっています。 また、本サンプルで使用しているエスケープ・シーケンスに関して下記サイトを参考にさせて頂きました。 ■参考サイト ANSI.SYS - キーボードと画面の拡張制御のサポート [FPCU]DOS/V&Windowsコマンド・プロンプト・リファレンス http://www.fpcu.jp/dosvcmd/ansi.htm ■サンプルプログラム /* * tesc.c : エスケープシーケンスによる1行消去のテストプログラム * *【概要】 * コンソール画面に出力した文字列を行単位に出力した行数分消去を * 行ないます。 *【補足】 * 1)本プログラムは、Windows系OS用のコンソールプログラムです。 * 2)コンソール画面のカーソル制御などのために、ANSIエスケープ・ *   シーケンスを使用しています。 * *<使用しているエスケープ・シーケンス> * ※下記中の"ESC"はエスケープコード(0x1B)を意味します。 * ・ESC[s  :カーソル位置の保存 * ・ESC[u  :カーソル位置の復元 * ・ESC[nnA :カーソルを上にnn行移動(カーソルが最上行の時は無視される) * ・ESC[K  :現在行のカーソル位置以降を消去 */ #include <stdio.h> #include <conio.h> /* define const */ #define ESC "\x1b" //エスケープ文字(ESC:0x1B)の定義 int main(void) { int i, icnt; /* ダミー文字列の表示(1行表示毎に行カウンタを+1する) */ icnt = 0; //行カウンタのリセット printf("01:*** 1行目***\n"); icnt++; printf("02:*** 2行目***\n"); icnt++; printf("03:*** 3行目***\n"); icnt++; printf("04:*** 4行目***\n"); icnt++; printf("05:*** 5行目***\n"); icnt++; /* 表示した文字列の消去(現在行から遡って行カウンタ分の1行消去を行なう) */ _cputs(ESC"[s"); //カーソル位置の保存(現在行でカーソルが左端にあることが前提) for(i=0; i<icnt; i++){ //行カウンタ分ループ _cputs(ESC"[1A"); //カーソルを上に1行移動(カーソルが最上行の時は無視される) _cputs(ESC"[K"); //現在行のカーソル位置以降を消去 } _cputs(ESC"[u"); //カーソル位置の復元 return 0; }

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

> printf 関数などで出力した文字を行単位などで消したい場合,・・・  ご質問の内容は、仮にキーボードから入力している状態を想定した場合に、Back Space キーを押下するようなことでしょうか?

sorokuku
質問者

お礼

はい. そうです,説明が不足して申し訳ありません.

関連するQ&A

  • 改行させずに文字配列を出力させる関数

    改行させずに文字配列を出力させる関数は、printf以外にありますか? printf("Hello world!!"); //改行せずに出力 char str[]="Hello world!!"; puts(str); //改行されて出力 出力の最後に自動的に改行文字を追加しないで、文字配列を表示する標準関数って、printf以外にありますか? もしくは、改行されない関数が必要な場合は自作するしかありませんか?

  • C言語で文字列の出力の問題

    1行目に文字列aを出力し、2行目にaの各文字を2回づつ出力し、3行目にaの格文字の文字コードを出力する関数 void print_string(char a[]) を作成せよ。 この関数を print_string("abcd") で呼び出したときの出力は abcd aabbccdd 97 98 99 100 となる。 という問題なのですが、2行目と3行目をどうしたら文字列aの文字や文字コードを個別に出力できるのかわかりません。 1行目までしかできてないですが、次のが私の作ったプログラムです。 #include <stdio.h> void print_string(char a[]) { printf("%s\n",a); } int main (void) { print_string("abcd"); return(0); } よろしくお願いします。

  • コマンドラインに入力されている文字列の1文字を出力

    ○下記のコードについての質問になります #include <stdio.h> int main( int argc, /*コマンドライン引数*/ char *argv[] /*コマンドライン */ ) { int counter; /*ループカウンタ*/ for( counter = 0 ; counter < argc ; counter++) { printf( "argv[%d]:%s\n" , counter , argv[counter] ); } /*----------------------------------------------------------- printf( "コマンドラインの1文字を抜き取る:%c" , ????????); ------------------------------------------------------------*/ return (0); } ○質問 コマンドラインのプログラムになります。 「--」で囲っている部分になりますが、 コマンドラインに入力されている文字列の1文字だけを出力できるように したいのですが、どうすればこれを実現することができるのでしょうか?? 一例として >command.exe orange ringe ^^^^^^ と、コマンドを打ったときに、「^^」の部分になりますが、 orangeの「a」だけを出力させたい場合を、知りたいと思っております。 以上、宜しくお願いします。

  • 【c++】関数の仕様を出力

    クラス内で作成している各関数の仕様をファイルとして出力したいです。 Visual studioを使っていると、 ツールで「クラスビュー」や「オブジェクトブラウザ」などで関数の仕様などが出力されると思います。 Visual studio の機能でも、外部ツールの機能でも良いです。

  • コマンドプロンプトの文字に色をつける

     今晩は、Cの初心者です宜しくお願いします。  友人に聞くとコマンドプロンプトに表示させた文字にも色をつけることが出来ると聞きました。  エスケープシーケンスでえサイトの検索を書けたのですがヒットしません。  宜しくお願いします。

  • エスケープコマンドの出力ができません

    エスケープコマンドを出力しようと下記のようなコードを実行しました. 本来であれば画面がクリアされるはずなのに,出力は "?[2J" と表示されました(""の内側です). ただし'?'の部分はEnterキーに記されているような矢印記号で,機種依存文字だと思われます. 正しく画面クリアが実行されない原因がわからなくて困っています. どなたかご回答くださいますようお願いします. [環境] ・コンパイラ:Borland C++ 5.5.1 for Win32 ・OS:Win2000 [ソースコード] #include<stdio.h> void main(){ printf("\x1b[2J"); }

  • 関数の戻り値として文字列を返して、printfで出力させることはできますか?

    いま、引数の数値によって、文字列を返すという関数を作り、それをprintf関数で出力したいと考えているんですが、どうやって作ればいいのかわかりません。 char data_2_dtmfdata(u8 getdata) { switch(getdata) { case 0x01: //tone"1" return "KEY_1"; case 0x02: //tone"2" return "KEY_2"; case 0x03: //tone"3" return "KEY_3"; } } このような感じで関数を作成して、 printf("%s",data_2_dtmfdata(data)); printf関数でこのように設定してあげれば”KEY_1”とか”KEY_3”とかの文字列を出力してあげられるのでしょうか?

  • コメント /* を文字列に使いたい場合

    VC++6.0なんですが、 ” ”で囲んだ文字列内に /* を使いたい場合どうすれば いいのでしょうか。 なんかのエスケープシーケンスだとは思うのですが・・・

  • Visual C++ Express Edition でもprintf

    Visual C++ Express Edition でもprintfを使いたい 私は、Visual C++ 2008 Express Editionを使っています。  以前はVisual Studio 2005 Professionalを使っていました。 今まではプログラムを走らせている間の変数の変化を見るために、 printf関数を使って「出力」ウィンドウに数値を表示させていました。 Visual C++ 2008 Express Editionに変更してから、 同一のソースコードをコンパイル、実行しても printf文で記述した出力内容を「出力」ウィンドウに表示させることができません。 これは、Express Edition特有のものでしょうか? printfを使って変数を表示できる方法があれば教えてください。 よろしくお願いします。

  • c言語の文字列出力

    プログラミング超初心者です サイトで文字列の出力について調べていたところ c言語は変数に文字列を代入することができないのでstrcpy関数を使い以下のようにするとあります char s[5]; strcpy(s, "ABCDE"); printf("%s\n", s); ところが他のサイトでは以下のように説明しています char s[5] = "ABCDE"; printf("%s\n", s); 明らかに後者の方が簡単で良いように見えるのですが違いはなんですか? あと、文字列の配列の指定?の[5]の部分なのですが 数字を記載しているところがほとんどですが省略しているところも有ります どんな文字列が入るかわからない場合もありますがここは省略しない方が良いのですか? よろしくお願いします

専門家に質問してみよう