2016-04-26 43 views
-1

我有一個字符串數組,其中包含execvp的輸入參數。我怎樣才能把它變成一個字符串指針數組execvp從c中的char數組向execvp添加參數

對於一個參數的命令,兩個字符串都存在:

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」你不需要。參數中的最後一項必須是空指針。 –

+0

@Antti,對不起,混亂。我的參數數組大小爲4,其索引是3.那就是爲什麼。 –

+0

您正在寫入'arg [3]',其中'arg'是一個包含3個元素的可變長度數組。 –

回答

3

execvp()的參數列表必須是您的param列表加上一個(空終止符)的長度。所以,如果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++,你可能想使用'new char * [N + 1]'而不是'malloc()'。 –