目前我能看到它的唯一方法是循环遍历argv参数列表,获取最大的输入字符串并创建一个具有这个最大大小的新动态数组,指示每个元素的内存分配。
或者有更简单的方法吗?
答案 0 :(得分:2)
如果您将main
的签名定义为
int main(int argc, char *argv[]);
然后,这里argv
是一个指向作为命令行参数传递的字符串的指针数组。引用C99标准第5.1.2.2.1节 -
参数argc和argv以及argv指向的字符串 数组应由程序修改,并保留其最后存储的数组 程序启动和程序终止之间的值。
因此,您可以直接修改argv
元素指向的字符串,也可以复制这些字符串然后处理它们。
#include <stdlib.h>
int main(int argc, char *argv[]) {
char *strlist[argc];
int i = 0;
while(i < argc) {
strlist[i] = malloc(1 + strlen(argv[i]));
if(strlist[i] == NULL) {
printf("not enough memory to allocate\n");
// handle it
}
strcpy(strlist[i], argv[i]);
i++;
}
// process strlist
// after you are done with it, free it
for(i = 0; i < argc; i++) {
free(strlist[i]);
strlist[i] = NULL;
}
return 0;
}
答案 1 :(得分:0)
argv
是一个&#39;字符串数组&#39;本身:它是char*
的数组。
您可以简单地复制它(为每个元素分配内存)。对字符串使用char
(如你所建议的)2D数组可能不是一种非常有效的方法。
答案 2 :(得分:0)
这取决于你想要达到的目标。
argv
。 argv
已经是一个字符串指针数组。char argv_copy[7][256]
。这意味着,您可以使用一个足以满足预期字符串的数组argv
并查找最大的字符串。您只需复制argv
结构,即
char **argv_copy = malloc((argc - 1) * sizeof(char*));
int i;
for (i = 1; i < argc; ++i) {
argv_copy[i - 1] = malloc(strlen(argv[i]) + 1);
strcpy(argv_copy[i - 1], argv[i]);
}
答案 3 :(得分:0)
查看以下内容是否有帮助:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
char** myStrings;
int ii;
myStrings = malloc(argc * sizeof *myStrings);
for(ii = 0; ii < argc; ii++) {
myStrings[ii] = malloc(strlen(argv[ii])+1);
strcpy(myStrings[ii], argv[ii]);
}
for (ii = 0; ii < argc; ii++) {
printf("copied argument %d: it is '%s'\n", ii, myStrings[ii]);
}
}