2016-04-26 1 views
-1

У меня есть массив строк, содержащий входные параметры для execvp. Как я могу превратить его в массив указателей строк для execvp?Добавление параметров в execvp из массива char в c

Для команды с одним аргументом, две строки присутствуют:

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); 

соответственно.

Но что я могу сделать, когда не знаю количества аргументов?

Я попытался зацикливание

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'); 

, но это дало мне ошибки сегментации.

+1

Вы пишете мимо выделяемой 'array'. 'array [count]' не находится в массиве с размером 'count'. Вы не можете «strcpy» для случайных неинициализированных указателей; и вам не нужно. Последняя запись в аргументах должна быть нулевым указателем. –

+0

@ Аннет, Извините за путаницу. Мой массив param имеет размер 4, индекс которого равен 3. Вот почему. –

+0

вы пишете на 'arg [3]', где 'arg' - массив переменной длины с 3 элементами. –

ответ

3

Список аргументов execvp() должен быть длиной вашего списка param плюс один (нулевой терминатор). Так что, если param массив из C строк длины N:

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: добавить '(char **)' перед 'malloc()' для компиляции как C++. –

+0

Если вы используете C++, вы, вероятно, захотите использовать 'new char * [N + 1]' вместо 'malloc()'. –

Смежные вопросы