2012-02-19 6 views
1

私はコマンドラインで動作するプログラムを(C言語で)持っており、ユーザから任意の長さの文字列を受け入れるようにしたいと考えています。私がC++でプログラミングしていたのであれば、おそらく文字列ライブラリでgetline()関数を使用していましたが、C言語の同等物を見つけることはできません。 Xの長さのブロックで文字を読み込む必要がありますか?文字列がXの長さを超える場合は、新しい大きなブロックを作成し、新しいブロックにデータをコピーしますか?Cでのコマンドラインからの読み込み

+1

POSIXシステムのための非標準の[ 'getline'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html)が利用可能であります。それ以外にも、 'getc'と' realloc'を使って自分自身をロールバックすることができます。 – cnicutar

+0

は 'getline()'に慣れていませんが、文字列を徐々に大きくて大きなメモリブロックにコピーするのではなく、割り当てられた各ブロックを追跡しながら、必要に応じてX長のブロックだけを割り当てるのが理想的です。この1つ以上のブロックの集合は、入力文字列を表す。 – ardnew

答えて

2

fgetssscanfを使用できます。

getlineは、現行のPOSIX:2008規格に含まれていることに注意してください。

http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html

+0

'fgets'は最大の長さが必要です。最初に' scanf'を使うのはなぜですか? – Ryan

+0

@minitech 'fgets' +' sscanf'は通常 'scanf'より優先されます。詳細はhttp://c-faq.com/stdio/scanfprobs.htmlを参照してください。 – ouah

+0

しかし、それは本当に質問に答えません。編集:気をつけて、編集を見た。 – Ryan

0

利用のreadlineライブラリhttp://cnswww.cns.cwru.edu/php/chet/readline/rltop.html(ライセンスを好きではない場合もBSD相当あります)。

そこから、あなたは、ユーザーが入力した行のchar *に戻ります機能readline()を、使用して取得(あなたが完了したら、それにfree()を呼び出すようにしてくださいまたはあなたがメモリリークを持っています)。ユーザが上の矢印を押して(他のほとんどすべての端末のように)前の行を取得できるように設定できるオプションさえあります。

0

realloc()を使用して入力バッファを拡張することができます。データをコピーする必要はありません。あなたのためにそれを行います。一般的なパターンは次のとおりです。

if (n_read >= buf_size) { 
    buf_size *= 2; 
    *buf = realloc(sizeof(char) * buf_size); 
} 
関連する問題