将字符串附加到C中的字符串数组

时间:2013-11-07 23:42:47

标签: c

我有char **argv={"ls","-l","/bin"},我想把它变成一个包含"ls","-l","/bin", (char *)NULL的字符串数组。我试过了argv={*argv,(char *)NULL};,但编译器告诉我''''令牌'之前的预期表达式。我该怎么做才能得到它? 顺便说一句,我可以使用“{}”来声明字符串数组吗?

2 个答案:

答案 0 :(得分:0)

char const *argv[] = { "ls", "-l", "/bin", NULL };

如果要有条件地添加其他参数,可以添加伪参数并按需填充它们:

/* the '23' depends on the number of conditions evaluated below */
char const *argv[23] = { [0] = "ls", [1] = "-l", [2] = "/bin" };
size_t idx = 3;

if (user_wants_a)
     argv[idx++] = "-a";

当用户可以添加任意数量的数据时,您必须动态分配argv []:

char const **argv = calloc(<number-of-elements>, sizeof argv[0]);

argv[0] = "ls";
argv[1] = "-l";
...

并按需扩大:

new_argv = realloc(argv, <new-number-of-elements> * sizeof argv[0]));
BUG_ON(!new_argv);
argv = new_argv;

答案 1 :(得分:0)

如果要从用户输入中将值解析到数组中,您可能已经通过以下两种方式之一分配了数组:

  1. 在堆栈上:char *argv[MAX_ARGS];
  2. 在堆上:char **argv = malloc( num_args * sizeof(char*) );
  3. 在这两种情况下,假设数组中都填充了num_args个值,并且您希望在结尾处粘贴NULL。在第一种情况下,如果MAX_ARGS大于num_args+1,则可以执行以下操作:

    argv[num_args] = NULL;
    

    在第二种情况下,它有点棘手,因为阵列只是足够大。在这种情况下,您需要先重新分配它:

    argv = realloc( argv, (num_args+1) * sizeof(char*) );
    if( argv ) argv[num_args] = NULL;
    

    还有第三个案例我没有考虑过。这就是argv实际提供给main函数的地方。在这种情况下,您应该 realloc。而是制作数组的副本:

    char *argv2 = malloc( argv, (num_args+1) * sizeof(char*) );
    if( argv2 ) {
        memcpy( argv2, argv, num_args * sizeof(char*) );
        argv2[num_args] = NULL;
    }