这些代码有什么作用?

时间:2012-08-16 12:22:24

标签: c

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

#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 个答案:

答案 0 :(得分:4)

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

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

您的代码使用argv调整argcoptind来跳转刚刚使用的参数。

答案 1 :(得分:3)

它是getopt使用的全局变量。

从手册:

  

getopt()函数解析命令行参数。它的论点   argc和argv是传递给main()的参数count和数组   程序调用的功能。

     

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

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

答案 2 :(得分: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的回答。

答案 3 :(得分: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会有下一个索引。