0

私は学校の課題のために (C で) シェルを実行していますが、この問題があります。入力を読み、単語の配列を持っています。(このように: {"/bin/ls", "-l", ">", "file"}) そして、「<」、「>」、「|」などの特殊記号の間にすべての単語を含むサブ配列が必要です. したがって、私の入力が

/bin/ls -l > f.txt > /usr/bin/wc

私がしたい:

{{"bin/ls", "-l"}, {"f.txt"}, {"usr/bin/wc"}}

正しい引数で execv を簡単に呼び出すことができるようにします。

現在、私は char*** を持っていますが、これを 3 サイクルで割り当てることはほとんどなく、単純ではないいくつかのアルゴリズムを使用して char** から char*** にコピーしています。

文字列の配列を文字列の配列の配列に分割する簡単な方法はありますか? (私には、配列を部分文字列に分割するのは簡単な作業のように見えますが、C は私にとってかなり困難です)

また、これらの特殊なシンボルで入力を分割し、それらの間で配列を取得できることは知っていますが、配列を分割してどのようにそれを行うことができるかに興味があります。

4

1 に答える 1

0

C では、配列はメモリの連続したチャンクにすぎません。境界チェックを自分で処理する必要があるため、それを行うだけでもかまいません。つまり、char **wordswords[0] が指す場所/bin/ls、words[1] が指す場所-l、words[2] が指す場所>などがある場合、必要なものはすでにあります。実際のコードではchar ***commands、コマンドの数に応じて動的にサイズを変更しますが、単純なケースでは次のことができます。

char **first_command, **second_command, **third_command;
first_command = words;
second_command = words + 3;
third_command = words + 5;

first_command配列の最初の要素を指すようになりました({"/bin/ls", "-l"}したがって、配列をsecond_command指す)、配列の最初の要素を指す{"f.txt"}などです。このセットアップfirst_command[2]では配列外の参照ですが、追跡する必要があることに注意してください境界の。言い換えれば、単語をコピーするのではなく、単語がどこにあるかを追跡するだけです。

于 2013-05-21T12:28:50.877 に答える