ページ 11

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

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

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

Posted: 2016年3月14日(月) 23:14
by amehirune
さっき検索しながら適当に作ったので、使用性に欠けますが。
要するにこういうことでしょうか?

コード:

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);
	}

}

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

Posted: 2016年3月15日(火) 12:42
by YuO
標準的な機能ではキーボード入力と固定された入力をサポートしない上に,
通常キーボードが接続される標準入力に対して,バッファリングされない入力は存在しません。

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

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

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

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

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

Posted: 2016年3月15日(火) 14:56
by namachan10777
>>Yuoさん
標準Cでは出来ないのですね。
>>amehirune
そういう動作を想定していました。

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