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