-1

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

4

2 回答 2

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;
于 2013-11-07T23:47:10.100 回答
0

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

  1. 在堆栈上:char *argv[MAX_ARGS];
  2. 在堆上:char **argv = malloc( num_args * sizeof(char*) );

在这两种情况下,假设数组中都填充了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;
}
于 2013-11-07T23:51:28.293 回答