[英]Copying Command Line Arguments Into an Array
对于程序,我想使用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;
}
如您所料,这是行不通的。 如果这完全不合时宜,我会提前道歉,因为我刚刚开始学习指针。 另外,我不太确定在对副本执行所需的操作后如何编写代码以释放* array中的每个元素。
任何人都可以给我一些提示,让我了解如何使它做我想要的事情?
谢谢你的帮助!
您没有分配或复制终止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];
}
}
首先,您需要分配一个char *向量,而不仅仅是char *
char **array;
array = malloc(sizeof(char*)*(argc+1)); // plus one extra which will mark the end of the array
现在您有了char*
指针的array[0..argc]
然后对于每个参数,您需要为字符串分配空间
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) {...} */
同
char *array;
您定义一个char*
类型的对象。 也就是说:一个对象,其值可以指向一个char
(以及下一个char
,...,...)
你需要
char **array;
对于这种新类型, array
的值指向char*
,即另一个指针。 您可以分配内存并将已分配内存的地址保存在char*
,而无需使用char
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.