从命令行创建参数并保存在数组中
Posted
技术标签:
【中文标题】从命令行创建参数并保存在数组中【英文标题】:Create arguments from command line and save in an array 【发布时间】:2022-01-13 00:32:32 【问题描述】:我正在尝试从命令行保存我的参数及其参数,如下所示
./run cat hello.txt : grep left : wc -c
我想在不知道:
的数量的情况下按如下方式分隔数组中的每个参数
char *cat_args[] = "cat", "tests/nevermind", NULL;
char *grep_args[] = "grep", "left", NULL;
char *cut_args[] = "wc", "-c", NULL;
我怎样才能做到这一点?
int nbProc = 2;
for (int i = 0; i < argc; i++)
if (strcmp(argv[i], ":") == 0)
nbProc++;
int indice_debut[nbProc-2];
int j = 0;
for (int i = 1; i < argc; i++)
if (strcmp(argv[i], ":") == 0)
argv[i] = NULL;
indice_debut[j] = i + 1;
j++;
有了这个我就能得到indice_debut = 4,7
,因为:
在第4和第7位。
我试图这样运行它但没有运气,我这样做是为了可以使用execvp
。
execvp(argv[indice_debut[0]], argv + indice_debut[0]);
谢谢
【问题讨论】:
使用malloc()
动态分配数组
@Barmar 问题是我不知道我要制作多少个数组
您最多需要argc/2
数组。所以分配那么多。
你能给我看一下代码吗?命名数组怎么样?如果我不知道有多少,我将如何命名它们
指针数组只需要一个名称。
【参考方案1】:
使用malloc()
动态分配指针数组。最多可以有argc/2
命令,因为最坏的情况是交替word : word : word : ...
,所以分配那么多元素。数组元素可以指向argv
的元素,你可以用空指针替换:
参数来结束每个子命令。
int main(int argc, char **argv)
if (argc < 2)
printf("At least one command is required\n");
exit(1);
char **arg_arrays = malloc(argc/2 * sizeof *arg_arrays);
int array_index = 0;
int arg_index = 0;
while (arg_index < argc)
arg_arrays[array_index++] = &argv[arg_index];
for (; arg_index < argc && strcmp(argv[arg_index], ":") != 0; arg_index++)
argv[arg_index] = NULL;
// Execute each of the subcommands
for (int i = 0; i < array_index; i++)
pid_t pid = fork();
if (pid == 0)
execvp(arg_arrays[i][0], arg_arrays[i]);
else if (pid < 0)
perror("fork");
exit(1);
// wait for all the subcommands to finish
while (wait(NULL) > 0)
这只是一个如何解析子命令并执行它们的简单示例。如果您想从一个命令传递到下一个命令,则需要添加该代码。
【讨论】:
我从 'void *' [-Wint-conversion] argv[arg_index] = NULL; 得到这些消息不兼容的指针,指向分配给 'char' 的整数转换 警告:不兼容的整数到指针转换将“char”传递给“const char *”类型的参数;用 & [-Wint-conversion] execvp(arg_arrays[i][0], arg_arrays[i]); ^~~~~~~~~~~~~~~~ test.c:26:38:警告:不兼容的指针类型将“char *”传递给“char *const *”类型的参数;用 & [-Wincompatible-pointer-types] 获取地址 execvp(arg_arrays[i][0], arg_arrays[i]); 您能否也添加管道示例,仅供参考和一般知识 对不起,应该是char **argv
以上是关于从命令行创建参数并保存在数组中的主要内容,如果未能解决你的问题,请参考以下文章