2016-04-26 5 views
-1

Ich habe ein Array von Strings mit den Eingabeparametern für execvp. Wie kann ich es in ein Array von String-Zeigern für execvp verwandeln?Hinzufügen von Parametern zu Execvp aus Char-Array in c

Für Befehl mit einem Argument, sind zwei Strings vorhanden:

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

Und mit zwei Argumenten:

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

Wenn ich die Anzahl der Argumente im Voraus wissen, habe ich einfach

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

oder

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

.

Aber was kann ich tun, wenn ich die Anzahl der Argumente nicht kenne?

Ich versuchte

int count =4; 
char* arg[count]; 
for(int i=0;i<count;i++) 
{ 
    strcpy(exe[i],param[i]); 
    printf("%s\n",exe[i]); 
} 
strcpy(exe[count],'\0'); 

Looping, aber das gab mir segfaults.

+1

Sie vorbei an den zugewiesenen 'array' zu schreiben. 'array [count]' befindet sich nicht in einem Array, dessen Größe "count" ist. Sie können nicht zu zufälligen nicht initialisierten Zeigern "strcpy"; und du brauchst es nicht. Der letzte Eintrag in den Argumenten muss ein Nullzeiger sein. –

+0

@Antti, Sorry für die Verwirrung. Mein param-Array hat die Größe 4, dessen Index 3 ist. Deshalb. –

+0

Sie schreiben in 'arg [3]', wobei 'arg' ein Array variabler Länge mit 3 Elementen ist. –

Antwort

3

Die Arg-Liste zu execvp() muss die Länge Ihrer param Liste plus eins (Null-Terminator) sein. Also, wenn param N eine Reihe von C-Strings der Länge:

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; 

Jetzt können Sie anrufen:

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

Danke @John Zwinck für die schnelle Antwort. Ich stieß jedoch auf ein anderes Problem. Der Code char ** arg = malloc ((N + 1) * sizeof (char *)); zeigt ungültige Konvertierung von 'void *' zu 'char **'. Das liegt wahrscheinlich daran, dass ich g ++ verwende. Wie kann ich es mit g ++ laufen lassen, irgendeine Idee? –

+0

@SafwanUllKarim: füge '(char **)' vor 'malloc()' hinzu, um als C++ zu kompilieren. –

+0

Wenn Sie C++ verwenden, möchten Sie wahrscheinlich 'new char * [N + 1]' anstelle von 'malloc()' verwenden. –