将命令行参数复制到数组中

时间:2011-10-13 19:04:32

标签: c arrays pointers malloc

对于程序,我想使用malloc()通过命令行发送参数的数组副本。

例如,如果我做./a.out一两三 我想要一个带有{a.out,one,two,3}的数组。

但是,我在使程序运行时遇到了一些问题。这就是我所拥有的:

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 个答案:

答案 0 :(得分:3)

您没有分配或复制终止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];
    }

}

答案 1 :(得分:2)

首先你需要分配一个char *的向量,而不仅仅是char *

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) {...} */

答案 2 :(得分:0)

使用

char *array;

您定义了char*类型的对象。即:一个值可以指向char的对象(以及下一个char,...,...)

你需要

char **array;

使用这种新类型,array的值指向char*,即另一个指针。您可以在char*中分配内存并保存已分配内存的地址,而不是char