2016-04-26 3 views
-1

execvpの入力パラメータを含む文字列の配列があります。 execvpの文字列ポインタの配列に変換するにはどうすればよいですか?引数が1つのコマンドについては文字列からexecvpにパラメータを追加する

、2つの文字列が存在している:

char param[4][10] = ["wc","file.txt"] 

そして、二つの引数を持つ:私は事前に引数の数を知っている

char param[4][10] = ["cp","file1.txt","file2.txt"] 

場合、私は単に

を書くことができます
char *arg[]={param[0],param[1],NULL} 
execvp(arg[0],arg); 

または

char *arg[]={param[0],param[1], param[2], NULL} 
execvp(arg[0],arg); 

である。

しかし、引数の数がわからないときはどうすればよいですか?

私は

​​

をループしてみましたが、それは私にセグメンテーションフォルトを与えました。

+1

をあなたが割り当てられた 'array'過ぎて書いています。 'array [count]'はサイズが 'count'の配列にありません。初期化されていないポインタをランダムに 'strcpy 'することはできません。あなたはそうする必要はありません。引き数の最後の項目はNULLポインターでなければなりません。 –

+0

@Antti、混乱して申し訳ありません。私のparam配列のサイズは4です。そのインデックスは3です。 –

+0

あなたは 'arg [3]'に書きます。ここで 'arg'は3要素の可変長配列です。 –

答えて

3

execvp()へのargリストは、paramリストの長さ+ 1(ヌルターミネーター)である必要があります。 paramは、長さNのC文字列の配列であれば:

char** arg = malloc((N + 1) * sizeof(char*)); 
if (arg == NULL) { 
    abort(); 
} 
for (size_t ii = 0; ii < N; ++ii) { 
    arg[ii] = param[ii]; 
} 
arg[N] = NULL; 

今、あなたは呼び出すことができます。

execvp(arg[0], arg); 
+0

クイック返信のために@John Zwinckに感謝します。私は別の問題に遭遇した。コードchar ** arg = malloc((N + 1)* sizeof(char *)); 'void *'から 'char **'への無効な変換を示します。これは、g ++を使用している可能性があります。どうすればg ++で動かすことができますか? –

+0

@SafwanUllKarim: 'malloc()'の前に '(char **)'を追加してC++としてコンパイルします。 –

+0

C++を使っているなら、おそらく 'malloc()'の代わりに 'new char * [N + 1]'を使いたいでしょう。 –

関連する問題