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 回答 4

4

getopt库提供了几个函数来帮助解析命令行参数。

当你称它为getopt“吃”可变数量的参数时(取决于命令行选项的类型);“吃”的参数数量在optind全局变量中指示。

您的代码会调整argvargc使用optind来跳转刚刚使用的参数。

于 2012-08-16T12:28:50.850 回答
3

它是 . 使用的全局变量getopt

从手册:

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

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

该代码仅更新 argc 和 argv 以指向其余参数(已-跳过选项)。

于 2012-08-16T12:25:12.303 回答
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 的第一个元素的指针相应地升级。

关于为什么:

见卡罗利的回答。

于 2012-08-16T12:26:21.550 回答
0

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

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

一般来说optind会有下一个的索引。

于 2014-12-04T12:32:49.460 回答