0

ls, ls-l, ls-aUNIXと同じ機能を持つCでプログラムを書きました。ここで私がやりたいのは、元のlsと同じ方法でデータを印刷することです(1スペース距離の列)。列を作成するときにを使用する必要があることはわかっていprintf("%*s",size,string)ますが、列のサイズは列の最長の単語によって異なります。どうすれば簡単にできますか?私の唯一のアイデアは、最初に、ある構造ですべてのデータを収集し、次に最長の要素をチェックして、長さを変数に保存することです。これは列のサイズになります。

4

1 に答える 1

0

私はGNUcoreutilsでそれがどのように行われるかを調べたところですが、それが基本的にそれを行う方法です。

アルゴリズムが一度に1行だけを出力する場合、1つのコーナーケースがあります。1行に1つのエントリを要求し、非再帰的な検索を実行し、エントリを並べ替えないように要求し、lsに特定の行を使用するように明示的に指示しなかったブロックサイズ。

他のすべての場合、それは基本的にあなたが指定したことをします。構造体については、ある程度寛大に割り当て、不足した場合は指数関数的に再割り当てする構造体の配列をお勧めします。メモリ不足が発生した場合、または最初からメモリを節約したい場合は、その時点までにすでに持っているものを画面にダンプすることができます。

coreutils lsは%* sを使用せず、代わりにスペースを配置します(古代/壊れたlibcs​​との移植性を推測します)が、両方とも機能するはずです。

質問については、興味があればhttp://www.artfiles.org/gnu.org/coreutils/coreutils-8.20.tar.xzをご覧ください。

于 2012-12-17T20:39:44.517 に答える