対話型プログラムにヒストリ機能を付けたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
namachan10777
記事: 32
登録日時: 10年前
住所: 四国
連絡を取る:

対話型プログラムにヒストリ機能を付けたい

#1

投稿記事 by namachan10777 » 9年前

CLIの対話型プログラムにおいてbashやghciの様なヒストリ機能を実装するにはどうすればよいでしょうか。
言語はCで、readlineは使わずに実装したいです。
具体的な動作としては、文字列を打ち込み、エンターキーで入力した後アローキーの↑を押すと打った文字列が次の行に表示されるようにしたいです。
よろしくお願いします。
D言語!D言語!

アバター
amehirune
記事: 181
登録日時: 11年前
住所: どっか
連絡を取る:

Re: 対話型プログラムにヒストリ機能を付けたい

#2

投稿記事 by amehirune » 9年前

さっき検索しながら適当に作ったので、使用性に欠けますが。
要するにこういうことでしょうか?

コード:

int main(){

	char a[200];
	int n;
	
	while( true ){
		scanf( "%s", a );
		n = getch();
		if( ( ( n == 0x00 || n == 0xe0 ) ? getch(): n )==0x48 )
			printf("%s",a);
	}

}
ほら、来いよ!! 誤字や矛盾を指摘したい奴から、前に出てこいよぉおおおおおおおッ!!!
※都合により、不定期でしか現れません。即返などはできませんのでご了承ください※

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: 対話型プログラムにヒストリ機能を付けたい

#3

投稿記事 by YuO » 9年前

標準的な機能ではキーボード入力と固定された入力をサポートしない上に,
通常キーボードが接続される標準入力に対して,バッファリングされない入力は存在しません。

このため,環境を指定してもらわない限り,
「標準Cの範囲内では(未定義・未規定・処理系定義動作を使わずに)実装することは無理」と答えざるを得ません。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: 対話型プログラムにヒストリ機能を付けたい

#4

投稿記事 by YuO » 9年前

うーん,書いていてバッファリングされない入力というのがset(v)bufの話と勘違いされそうな気がしたので,一応。
set(v)bufしても,キーボード入力のバッファリングは必ずしもなくなりません。
元々,最初の入力の前にset(v)bufしなければいけないという制限が付いてきていますが……。

このあたり(カーソルキーの入力含めて),大昔からのFAQですね……。
http://www.kouno.jp/home/c_faq/c19.html

アバター
namachan10777
記事: 32
登録日時: 10年前
住所: 四国
連絡を取る:

Re: 対話型プログラムにヒストリ機能を付けたい

#5

投稿記事 by namachan10777 » 9年前

>>Yuoさん
標準Cでは出来ないのですね。
>>amehirune
そういう動作を想定していました。

標準Cでは実現することが出来ないとのことなのでncursesかtermiosを使いたいと思います。ありがとうございます。
D言語!D言語!

閉鎖

“C言語何でも質問掲示板” へ戻る