我有char **argv={"ls","-l","/bin"}
,我想让它成为一个包含"ls","-l","/bin", (char *)NULL
. 我试过argv={*argv,(char *)NULL};
了,但编译器告诉我'{'令牌'之前的预期表达式。我应该怎么做才能得到它?顺便说一句,我可以使用“{}”来声明字符串数组吗?
问问题
57 次
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
如果您将值从用户输入解析到数组中,您可能已经通过以下两种方式之一分配了您的数组:
- 在堆栈上:
char *argv[MAX_ARGS];
- 在堆上:
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 回答