Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Getopt()接受其他选项作为C中的参数_C_Command Line_Getopt_Command Line Arguments - Fatal编程技术网

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;