如何在c命令行工具中使用命令行选项?

如何在c命令行工具中使用命令行选项?,c,C,我正在试图理解如何使用命令行c工具的命令行选项,我偶然遇到了这个例子。如果有人能解释一下代码流是如何工作的,我无法理解它,而且我知道它使用了一个内置的getopt()函数 调用的exe是rocket_to,它有两个命令行选项,e和a。期权以4为参数,期权以巴西、东京、伦敦为参数 有人能解释一下代码是如何工作的吗 这是实际代码: 命令行: rocket_to -e 4 -a Brasalia Tokyo London 代码: #包括 .. while((ch=getopt(argc,argv,“

我正在试图理解如何使用命令行c工具的命令行选项,我偶然遇到了这个例子。如果有人能解释一下代码流是如何工作的,我无法理解它,而且我知道它使用了一个内置的getopt()函数

调用的exe是rocket_to,它有两个命令行选项,e和a。期权以4为参数,期权以巴西、东京、伦敦为参数

有人能解释一下代码是如何工作的吗

这是实际代码:

命令行:

rocket_to -e 4 -a Brasalia Tokyo London
代码:

#包括
..
while((ch=getopt(argc,argv,“ae:)!=EOF)
开关(ch){
..
案例“e”:
发动机计数=optarg;
..
}
argc-=optind;
argv+=optind;

包含POSIX规范的手册页面很多。它们描述了
getopt()
函数的功能。您还可以阅读POSIX,它描述了大多数程序如何处理参数(但规则中有很多例外,通常是因为POSIX之前的历史先例)

在示例大纲代码中,
-e
选项接受一个参数,即示例命令行中的
4
。您可以通过
getopt()
的第三个参数中的
e:
来判断(字母后面的冒号表示该选项带有参数)。
-a
选项不带参数;您可以判断,因为
getopt()
的第三个参数中没有冒号。选项处理完成后,名称
巴西利亚
东京
伦敦
为非选项参数。它们是
argv[0]
中的值<代码>argv[argc-1]在循环外的两个复合赋值之后

EOF
的使用不正确
getopt()
在没有更多选项可供处理时返回
-1
。要使用
getopt()
,不必包含


从getopt手册页:

函数的作用是:解析命令行参数。它的参数argc和argv是传递给的参数计数和数组 程序调用时的main()函数。argv中以“-”开头的元素(不完全是“-”或“-”)是option元素。此元素的字符(除了首字母“-”)是选项字符。如果反复调用getopt(),则 从每个选项元素中依次返回每个选项字符

getopt()
的第三个参数是有效选项。如果选项后跟冒号,则需要参数。可以通过optarg变量访问参数。因此,在您的示例中,有两个选项:“a”不带参数,“e”带参数

如果
getopt()
找到一个选项,它将返回该字符。如果解析所有选项,则返回-1;如果找到未知选项,则返回-1

因此,您的代码循环遍历所有选项,并在switch语句中处理它们


下一次当您理解类似的内容时,请尝试先运行
man

如果没有更多的代码,很难判断。
-e
选项包含一个参数,即命令行中的
4
。您可以通过
getopt()
的第三个参数中的
e:
来判断。
-a
选项不带参数;您可以判断,因为
getopt()
的第三个参数中没有冒号。选项处理完成后,名称
巴西利亚
东京
伦敦
为非选项参数。它们是
argv[0]
中的值
argv[argc-1]
在循环外部的两个复合赋值之后-a不接受参数;在调用getoptSearch for
getopt
getopt windows
的过程中,由于没有冒号(:),您可以分辨出来,并且您会找到大量解释一切的链接。是的,在询问之前先搜索,已经有很好的答案了。谢谢…酷…我想我现在明白了,但是我还是不明白这句话:argc-=optind;argv+=optind;它有什么作用??变量optind存储什么?AFAIAC,这不是我编写代码的方式,而是您的示例代码的编写方式。它调整指针
argv
(参数向量),使其指向第一个非选项参数,并调整参数计数
argc
,使其包含非选项参数的数量。全局变量
optind
getopt()
管理,并告诉您非选项参数的位置。我通常不会调整
argv
argc
;我会使用:
for(inti=optind;I取而代之。不过,这主要是口味的问题。
#include<unistd.h>
..
while((ch=getopt(argc,argv,"ae:"))!=EOF)
switch(ch){
..
case 'e':
 engine_count=optarg;
..
}
argc -=optind;
argv +=optind;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    int ch;
    int aflag = 0;
    char *engine_count = "0";
    while ((ch = getopt(argc, argv, "ae:")) != -1)
    {
        switch (ch)
        {
        case 'a':
            aflag = 1;
            break;
        case 'e':
            engine_count = optarg;
            break;
        default:
            fprintf(stderr, "Usage: %s [-a][-e engine] [name ...]\n", argv[0]);
            exit(EXIT_FAILURE);
        }
    }

    argc -= optind;
    argv += optind;

    printf("A flag = %d\n", aflag);
    printf("Engine = %s\n", engine_count);

    for (int i = 0; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);
    return 0;
}
$ ./rocket_to -e 4 -a Brasilia Tokyo London
A flag = 1
Engine = 4
argv[0] = Brasilia
argv[1] = Tokyo
argv[2] = London
$ ./rocket_to -a -e 4 Brasilia Tokyo London
A flag = 1
Engine = 4
argv[0] = Brasilia
argv[1] = Tokyo
argv[2] = London
$ ./rocket_to -e -a 4 Brasilia Tokyo London
A flag = 0
Engine = -a
argv[0] = 4
argv[1] = Brasilia
argv[2] = Tokyo
argv[3] = London
$