这些代码是做什么的?

5

我在一本书中看到了这段源代码:

#include <stdio.h>
#include <unistd.h>


int main(int argc, char *argv[])
{
    char *delivery = "";
    int thick = 0;
    int count = 0;
    char ch;

    while ((ch = getopt(argc, argv, "d: t")) != EOF)
        switch(ch)
        {
            case 'd':
                delivery = optarg;
                break;

            case 't':
                thick = 1;
                break;

            default:
                fprintf(stderr, "Unknown option: '%s'\n", optarg);
                return 1;
        }

        argc -= optind;
        argv += optind;

        if (thick)
            puts("Thick Crust.");

        if (delivery[0])
            printf("To be deliverd %s\n", delivery);

        puts("Ingredients: ");

        for (count = 0; count < argc; count++)
            puts(argv[count]);

    return 0;
}

我可以理解整个源代码,除了:

argc -= optind;
argv += optind;

我知道什么是argc和argv,但在这两行中它们发生了什么,"optind"是什么?请解释一下。
谢谢。
4个回答

4
getopt 库提供了几个函数来帮助解析命令行参数。
当您调用 getopt 时,它会“吃掉”一个可变数量的参数(取决于命令行选项的类型);已消耗参数的数量在全局变量 optind 中指示。
您的代码使用 optind 调整 argvargc,以跳过刚刚消耗的参数。

3

getopt使用的全局变量。

从手册中可以得知:

getopt()函数解析命令行参数。它的参数argcargv是在程序调用main()函数时传递的参数计数和数组。

变量optind是下一个要在argv中处理的元素的索引值。系统将此值初始化为1。

该代码仅将argcargv更新为指向其余参数的位置(跳过了-选项)。


或者,如果您已经安装了正确的手册页,man optind 将会给您提供相同的信息。 - Matteo Italia

2

关于如何:

optind 是 argv 数组中在这段代码后面将被忽略的元素数量:

argc -= optind; // reduces the argument number by optind 
argv += optind; // changes the pointer to go optind items after the first one

argc(计数)会因为 optind 而减少,

而 argv 的第一个元素指针也会随之升级。

关于原因:

请参考 Karoly 的答案。


0

在运行此代码时,您可以将其执行为./executable_file:name -d some_argument

当调用getopt时,它开始扫描命令行中写的内容。argc = 3,argv [0] = ./executable_file:name argv [1] = -d argv [2] = some_argument。 getopt将获取选项d,此时optind = 2,即下一个索引即argv [2]。 因此,optind + argv将指向argv [2]。

通常,optind将具有下一个索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接