2017-12-02 172 views
0

我的问题是基于前一个问题的询问ç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()开始while语句在main()

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

用什么数据结构?

+0

你可以传递参数数组(您可以将它们存储在一个阵列) – coderredoc

+0

@coderredoc我将如何计算的,通过'传递的参数长度i'?也就是说,在上面有5个文件 – ShanZhengYang

+0

如果我错了,纠正我 - 你想从选项'-i file1 -i file2'中得到你得到的文件的名字,然后你想把它们传递给其他方法。现在你的问题是你如何将它们传递给其他方法? – coderredoc

回答

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 
+0

感谢您的帮助。以上对我来说很有意义。然而,我仍然不理解函数'function1()'是如何获取数组中的文件名并使用它们的。如果函数调用是'function1(required_arg,file1,file2,file3)',那么必须编写'function1()',以便抓取这些文件名并对它们执行某些操作。我的问题有意义吗? – ShanZhengYang

+1

@ShanZhengYang:你不能合理地编写一个函数来获取一个可变长度的参数列表,然后用一些在运行时变化的参数轻松地调用它。想想'printf()';你总是在编译时修正在调用中传递的参数的数量,并且在运行时你不能改变这个数字。与'execl()'和'execlp()'类似;您不能在运行时更改变量列表中的参数数目(具体而言,您不能将其增大到无限大;有多种方法可以使用最大大小或更小)。 _ [... continue ...] _ –

+1

_ [... continuation ...] _如果您想在运行时使用无限个参数,则可以使用数组和长度(例如'qsort()')或数组和哨兵(例如,'execvp()' - 通常,对于字符串或任何其他指针数组的数组,哨兵是空指针)。这就是建议的内容。 –