在C中如何动态地将命令行参数添加到字符串数组?

时间:2014-03-23 16:13:23

标签: c command-line-arguments dynamic-arrays argv c-strings

目前我能看到它的唯一方法是循环遍历argv参数列表,获取最大的输入字符串并创建一个具有这个最大大小的新动态数组,指示每个元素的内存分配。

或者有更简单的方法吗?

4 个答案:

答案 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)

这取决于你想要达到的目标。

  • 您可以原样使用argvargv已经是一个字符串指针数组。
  • 您可以使用固定大小的数组,例如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]);
  }
}