Getopt()接受其他选项作为C中的参数
所以我到处寻找这个问题的答案,我所能找到的只是一个两年前问得很糟糕的人,他从来没有得到过真正的回答() 目前,我正在编写一个程序,该程序应该接受命令行选项和参数。 该命令用于创建和操作通过命令行提供的存档文件。我正在使用Getopt()接受其他选项作为C中的参数,c,command-line,getopt,command-line-arguments,C,Command Line,Getopt,Command Line Arguments,所以我到处寻找这个问题的答案,我所能找到的只是一个两年前问得很糟糕的人,他从来没有得到过真正的回答() 目前,我正在编写一个程序,该程序应该接受命令行选项和参数。 该命令用于创建和操作通过命令行提供的存档文件。我正在使用getopt()。该命令的用法是oscar[options][archive file][member files],但是有些选项不需要参数。例如一个“-v”标志,它代表verbose,只会导致文件中的其他操作输出比默认值更多的打印语句 下面是我使用getopt()的代码: 现在
getopt()
。该命令的用法是oscar[options][archive file][member files]
,但是有些选项不需要参数。例如一个“-v”标志,它代表verbose,只会导致文件中的其他操作输出比默认值更多的打印语句
下面是我使用getopt()的代码:
现在我面临的问题是,我传递选项字符的顺序在不应该传递的情况下很重要
例如:
如果我使用/oscar-va archive
调用函数,代码将正常运行,v
将打开v标志,a
将以archive
作为参数进行处理,因为我要求a
在getopt()中包含一个参数
但是,如果我使用/oscar-av archive
调用函数,代码将读入a
并将v
指定为其所需参数,而不是将v
作为选项并将archive
用作a
的参数
我是否可以告诉getopt()
跳过argv[]中的其他选项值,这样我就可以通过各种组合从命令行调用函数,而不必担心顺序,例如:
/oscar-avo归档文件1文件2文件3…
/oscar-a v archive file1 file2…
根据用户n.m.
的评论,这正是命令行参数应该按照POSIX指南的规定运行的方式
根据他的评论:
在一个“-”分隔符后面分组时,应接受一个或多个不带选项参数的选项,后跟最多一个带选项参数的选项
如果您希望使用我正在寻找的功能,则需要使用getopt提供给您的外部变量:optind
与argc
和argv[]
配合使用,以手动处理更多需要参数的选项
感谢阅读。哎呀,很抱歉编辑不好。我无意中删除了问题中的所有数字,而不仅仅是行号。这是POSIX指南规定的程序选项的标准行为。“一个或多个不带选项参数的选项,后跟最多一个带选项参数的选项,在分组到一个“-”分隔符后应该被接受。”不要违反标准。啊,好的,我明白了。我通过使用optind和argc找到了如何绕过它并手动处理它,但是谢谢你的回答。这真的让我心烦。我不想听起来过于挑剔,但请告诉我这不是严重的。我不想键入-a存档
,并将其解析为选项-a
、选项-a
、参数-a
“rc”、选项-h
、参数-a
“I”、选项-v
、选项-e
。我希望它是option-a
,后跟它的参数“Archive”。如果这不仅仅是一个选项解析的练习,我希望永远不要使用你的程序,因为如果我想弄清楚如何正确地传递命令行选项,我会非常恼火getopt
的工作方式是有原因的。请不要破坏用户的预期行为。这是非常严重的。这是我操作系统课的作业,教授希望我们使用这个程序。使用他的示例程序,您可以首先使用必需的选项调用它,它仍然像一个符咒一样工作。我的教授还说他使用了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;