ページ 11

コマンドライン上で改行後の文字列削除

Posted: 2011年6月08日(水) 14:52
by aria
はじめまして、C言語でどうしても判らないところがあり、皆さんの知恵をお借りしたいと思います。

コマンドライン上にprintf関数で出力した文字列があり、fgets関数で入力処理をした際、
入力の直前の行の文字列を消したいのですが、うまくいきません。
実行結果が下のようになればよいと思います。
//////////////////////////////
コマンドライン上
AAAAAAA
BBBBBBB
CCCCCC_←(ここで入力処理)


コマンドライン上
AAAAAAA
BBBBBBB
_
///////////////////////////////


fgets関数でコマンドラインから入力処理を行う際、最後にエンターキーを押しますよね。
問題は入力前の文字列をprintf("\r \r")を使って見た目上消そうとしたのですが、
入力後に改行が入るので行がずれてエスケープシーケンスが効きません。
windowsなので、エスケープシーケンスでカーソル制御も出来ず、どうすればよいかで困っています。

system(”cls”)を使わずでお願いいたします。

Re: コマンドライン上で改行後の文字列削除

Posted: 2011年6月08日(水) 17:47
by さかまき
猫でもわかるプログラミング のC言語編58章、59章あたりを参考にすれば
コンソールAPIを使用してなんとかなるのではないでしょうか

Re: コマンドライン上で改行後の文字列削除

Posted: 2011年6月08日(水) 17:57
by ISLe
C言語の標準機能ではできないので、何らかのライブラリの力を借りる必要があります。

いくつか案はありますが、
  1. fgetsを使わずconioで自前でエコーバックするようにして改行を握り潰す。
  2. Win32のコンソールAPIを直接使ってカーソルを移動させる。
  3. cursesライブラリを使ってカーソルを移動させる。
といったところでしょうか。
1は入力処理を自前で組む必要があってめんどうくさいし、環境依存があるかもしれません。
Visual C++なら1,2は追加のインストールとか無しで可能です。
ウインドウズに限定しないなら3が良いと思います。

Re: コマンドライン上で改行後の文字列削除

Posted: 2011年6月08日(水) 18:02
by non
コンソールAPIでもカーソルを1つ上にあげるMS-DOSにおけるエスケープシーケンスの\033[1A の代わりをするのは
なかったと思います。しかし,指定場所にカーソルを移動させることはできますから,コンソールのどこに何という文字が
書かれているかを把握しておけばなんとかなります。

Re: コマンドライン上で改行後の文字列削除

Posted: 2011年6月08日(水) 18:33
by aria
さかまきさん、 ISLeさん、nonさんすばやい回答ありがとうございます。
カーソルを操作できるヘッダを使って挑戦しようと思います。
ありがとうございます。