Getopt()在C中接受其他选项作为参数

时间:2014-10-24 05:42:53

标签: c command-line getopt command-line-parsing

所以我搜索了这个问题的答案,所有我能找到的是2年前对同一个问题提出质疑并且从未真正回答过的人(option followed by a option in getopt [where the earlier option was expecting a value])。

目前,我正在编写一个应该接受命令行选项和参数的程序。 该命令应该创建和操作通过命令行提供的存档文件。我正在使用getopt()。该命令的用法是oscar [options] [archive-file] [member files]但是有些选项不需要参数。例如'-v'标志代表详细,并且只是导致文件中的其他操作吐出比默认语句更多的打印语句。

这是我使用getopt()的代码:

 //declaring some variables to be used by getopt
 18     extern char *optarg;    //pointer to options that require an argument
 19     extern int optind;      //index into main()'s argument list (argv[])
 20
 21     int getOptReturn = 0;   //int that stores getopt's return (used to check if it is done parsing)
 22     int error = 0;          //flag for '?' case if getopt doesn't receive proper input
 23
 24     //flags for all the options
 25     int a_flag, A_flag, v_flag, C_flag, d_flag, e_flag, h_flag,
 26     m_flag, o_flag, t_flag, T_flag, E_flag, V_flag, u_flag = 0;
 27
 28     int i;                  //for loops index
 29
 30     char *aname;
 31
 32     //while parsing options
 33     while((getOptReturn = getopt(argc, argv, "a:A:Cd:e:E:hm:otTu:vV")) != -1)
 34     {
 35         //debugging
 36         printf("optind: %d, option: %c, optarg: %s \n", optind, argv[optind], optarg);
 37         printf("%d\n", argc);
 38
 39         //switch options and set appropriate flags
 40         switch(getOptReturn)
 41         {
 42             case 'a':
 43                 printf("-a option received\n");
 44                 //turn add flag on
 45                 a_flag = 1;
 46                 aname = optarg;
 47                 printf("argument supplied to -a: %s \n", aname);
 48                 break;
 49             case 'A':
 50                 printf("-A option received\n");
 51                 //turn add all flag on
 52                 A_flag = 1;
 53                 aname = optarg;
 54                 printf("argument supplied to -A: %s \n", aname);
 55                 break;
 56             case 'v':
 57                 printf("-v option received\n");
 58                 //turn verbose flag on
 59                 v_flag = 1;
 60                 printf("verbose flag turned on!\n");
 61                 break;

现在我遇到的问题是,我传递选项字符的顺序当前很重要。

例如:

如果我使用./oscar -va archive调用该函数,则代码正常运行,v导致v标志打开,a处理为archive作为参数因为我要求agetopt()内有一个参数。

但是,如果我使用./oscar -av archive调用该函数,则代码会在a中读取并指定v作为其必需参数,而不是将v作为选项并使用{ {1}}作为archive的参数。

有什么方法可以告诉a跳过argv []中的其他选项值,这样我就可以从命令行调用各种组合的函数而不用担心顺序如下: / p>

getopt()

./oscar -avo archive file1 file2 file3...

1 个答案:

答案 0 :(得分:2)

根据用户n.m.的评论,这就是命令行参数应该如何按照POSIX指南的规定运行。

来自他的评论:

  

“在一个' - '分隔符后面分组时,应该接受一个或多个没有选项参数的选项,后面跟最多一个带选项参数的选项。”

如果您需要我正在寻找的功能,您需要使用getopt为您提供的外部变量:optindargcargv[]配对以手动处理更多选项需要参数。

感谢阅读。