Копирование аргументов командной строки в массив - PullRequest
2 голосов
/ 13 октября 2011

Для программы я бы хотел сделать копию массива аргументов, переданных в командной строке, используя malloc ().

Так, например, если я сделаю ./a.out один два три Я хочу массив с {a.out, один, два, три} в нем.

Однако у меня есть некоторые проблемы с работой моей программы. Вот что у меня есть:

static char** duplicateArgv(int argc, char **argv)                                                                                                                                                         
{                                                                                                                                                                                                                                                                                                                                                                                       
    char *array;                                                                                                                                                                                                                                                                                                                                                               
    int j = 0;                                                                                                                                                                                        

    // First allocate overall array with each element of char*                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
    array = malloc(sizeof(char*) * argc);                                                                                                                                                       
    int i;                  

    // For each element allocate the amount of space for the number of chars in each      argument                                                                                                                                                              
    for(i = 1; i < (argc + 1); i++){                                                                                                                                                                      
        array[i] = malloc(strlen(*(argv + i)) * sizeof(char));                                                                                                                                        
        int j;       

        // Cycle through all the chars and copy them in one by one                                                                                                                                                                                 
        for(j = 0; j < strlen(*(argv + i)); j++){                                                                                                                                                     
            array[i][j] = *(argv + i)[j];                                                                                                                                                                                                                                                                                                                                                       
        }                                                                                                                                                                                             

    }                                                                                                                                                                                                 

    return array;

}

Как вы можете себе представить, это не работает. Я заранее прошу прощения, если это как-то не имеет смысла, так как я только начал изучать указатели. Кроме того, я не совсем уверен, как написать код для освобождения каждого элемента в массиве * после того, как я сделаю то, что мне нужно для копии.

Может ли кто-нибудь дать мне несколько советов о том, что мне следует изучить, чтобы заставить его делать то, что я хочу?

Спасибо за любую помощь!

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Вы не выделяете и не копируете завершающие NULL-символы:

Эта строка должна быть изменена на NULL.

array[i] = malloc((strlen(*(argv + i)) + 1) * sizeof(char));   

И цикл должен быть изменен на этот:

for(j = 0; j <= strlen(*(argv + i)); j++){ 

Кроме того, код может быть лучше оптимизирован, если вы сохранили результат вызова strlen(), так как вы вызываете его во многих местах.

Попробуйте цикл следующим образом:

// For each element allocate the amount of space for the number of chars in each argument
for(i = 0; i < argc; i++){

    int length = strlen(argv[i]);

    array[i] = malloc((length + 1) * sizeof(char));
    int j;

    // Cycle through all the chars and copy them in one by one
    for(j = 0; j <= length; j++){
        array[i][j] = argv[i][j];
    }

}
2 голосов
/ 13 октября 2011

сначала нужно выделить вектор символа *, а не просто символ *

char **array;

array = malloc(sizeof(char*)*(argc+1)); // plus one extra which will mark the end of the array

теперь у вас есть array[0..argc] из char* указателей

тогда для каждого аргумента вам нужно выделить место для строки

int index;
for (index = 0; index < argc; ++index)
{
   arrray[index] = malloc( strlen(*argv)+1 ); // add one for the \0
   strcpy(array[index], *argv);
   ++argv;
}
array[index] = NULL; /* end of array so later you can do while (array[i++]!=NULL) {...} */
0 голосов
/ 13 октября 2011

С

char *array;

вы определяете объект типа char*. То есть: объект, значение которого может указывать на char (а следующий char, ..., ...)

Вам нужно

char **array;

С этим новым типом значение array указывает на char*, то есть на другой указатель. Вы можете выделить память и сохранить адрес этой выделенной памяти в char*, вы не будете делать это с char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...