代码之家  ›  专栏  ›  技术社区  ›  user1561108

在C语言中,如何向字符串数组动态添加命令行参数?

  •  0
  • user1561108  · 技术社区  · 10 年前

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

    还是有更直接的方法?

    4 回复  |  直到 10 年前
        1
  •  3
  •   ajay    10 年前

    如果您定义 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;    
    }
    
        2
  •  1
  •   Floris    10 年前

    查看以下内容是否有帮助:

    #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]);
      }
    }
    
        3
  •  0
  •   nullptr    10 年前

    argv 本身是“字符串数组”:它是 char* .

    您可以简单地复制它(为每个元素分配内存)。使用二维阵列 char (正如您所建议的)字符串可能不是一种非常有效的方法。

        4
  •  0
  •   Olaf Dietsche    10 年前

    这取决于你想要实现什么。

    • 您可以使用 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]);
      }