从命令行创建参数并保存在数组中

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

以上是关于从命令行创建参数并保存在数组中的主要内容,如果未能解决你的问题,请参考以下文章

从命令行参数指定数组

实验:从命令行接收多个数字并求和

第52课 命令行参数的应用

在 psql 命令行上传递数组参数

29.命令行参数

如何设置将存储我的命令行参数的数组的大小?