用C getopt跟踪几个多个参数

时间:2017-12-02 16:45:05

标签: c arguments

我的问题是基于上一个问题,询问C optget如何使用多个值:C getopt multiple value

在我的情况下,我只有一个参数-i,这是可选的。用户必须使用以下语法:

/a.out -i file1 -i file2 -i file3

如果用户未提供-i标志,则程序运行正常。用户可以提供无限数量的文件作为可选参数,例如

/a.out -i file1 -i file2 -i file3 -i file4 -i file5 ...

我从getopt()中的main() while语句开始:

char *input;  // ?? Now syntactically correct, but uninitialized?

while ((opt = getopt(argc, argv, "i:"))!= -1){
    case 'i':
        if (optarg == NULL){
            input = NULL;
            } 
        else{
            strcpy(input, optarg);
            break;
  ...
}
然后我会将这些可选参数传递给函数:

function1(char *required_arg, ...)

在上述情况下,它将是:

function1(required_arg, file1, file2, file3, file4, file5)

目前,我将input定义为“文件”。我的问题是,如何跟踪任意数量的可选参数以便稍后传递给函数?上面的代码是错误的,因为我正在为传递的每个input参数重新定义-i

使用什么数据结构?

1 个答案:

答案 0 :(得分:2)

我建议的解决方案是传递数组中的文件名。此解决方案假设最大文件数为10,最大文件名长度为30.但在类似的说明中,我们可以提供动态分配的机会,允许任意数量的文件。

#include <stdio.h>
#include <unistd.h>
#include <string.h>

#define MAXLEN 30
#define MAXFILECOUNT 10
void print(int fileCount, char files[][MAXLEN+1]){
    for(int i = 0; i < fileCount; i++){
        printf("%s \n",files[i]);
    }
}
int main(int argc, char **argv)
{
    int opt;
    char fileName[MAXFILECOUNT][MAXLEN+1];
    int count = 0;

    while ((opt = getopt(argc, argv, "i:")) != -1)
    {
        switch (opt)
        {
        case 'i':
            snprintf(fileName[count++],MAXLEN,"%s",optarg);
            break;
        }
    }
    print(count,fileName);
    return 0;
}

一样调用该程序
./a.out -i file1 -i file2