根据我将选项传递给此程序的格式,变量optind将适当增加以反映下一个选项值,否则将不会。
如果我使用./cfind -aru,我将得到以下(奇怪的)输出。

optind: 1
aflag detected
optind: 1
optind: 1
rflag detected
optind: 1
optind: 2
uflag detected
optind: 2

请注意,optind不是从aflag增加到rflag,而是从rflag增加到uflag。
但是,当我使用格式./cfind-a-r-u时,会得到以下(预期的)输出。
optind: 2
aflag detected
optind: 2
optind: 3
rflag detected
optind: 3
optind: 4
uflag detected
optind: 4

这是我想要的结果。
这个函数的代码如下。
#include "cfind.h"
#define OPTLIST "acdirstu" // list of valid options

void ProcOpt(int argc, char *argv[]) {
    int opt = 0; // default value
    opterr = 0; // prevent getopt from passing error message to stderr buffer
    // char *filenm = NULL; // pointer to the path name
    while((opt = getopt(argc, argv, OPTLIST)) != -1) {
        switch (opt) {
            case 'a':
                fprintf(stdout, "optind: %i\n", optind);
                aflag = true;
                assert(aflag == true);
                fprintf(stdout, "aflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;
            case 'c':
                fprintf(stdout, "optind: %i\n", optind);
                cflag = true;
                assert(cflag == true);
                fprintf(stdout, "cflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;
            case 'd':
                fprintf(stdout, "optind: %i\n", optind);
                dflag = true;
                assert(cflag == true);
                fprintf(stdout, "dflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;
            case 'i':
                fprintf(stdout, "optind: %i\n", optind);
                iflag = true;
                assert(iflag == true);
                fprintf(stdout, "iflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;
            case 'r':
                fprintf(stdout, "optind: %i\n", optind);
                rflag = true;
                assert(rflag == true);
                fprintf(stdout, "rflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;
            case 's':
                fprintf(stdout, "optind: %i\n", optind);
                sflag = true;
                assert(sflag == true);
                fprintf(stdout, "sflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;
            case 't':
                fprintf(stdout, "optind: %i\n", optind);
                tflag = true;
                assert(tflag == true);
                fprintf(stdout, "tflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;
            case 'u':
                fprintf(stdout, "optind: %i\n", optind);
                uflag = true;
                assert(uflag == true);
                fprintf(stdout, "uflag detected\n");
                fprintf(stdout, "optind: %i\n", optind);
            break;
            default:
                usage();
        }
    }
}

我做错什么了吗?我对getopt()和它是如何递增的有什么误解吗?
谢谢您。

最佳答案

我看这个输出是正确的。
optind是要处理的下一个参数的索引。当所有选项都在一起时,它们都在argv[1]中,因此optind在处理u选项之前保持为1。此时,由于argv[1]中的所有内容都已消耗,optind设置为2。
当选项都在argv的单独元素中时,optind始终是要处理的下一个参数的索引。
http://man7.org/linux/man-pages/man3/getopt.3.html

关于c - getopt()函数-optind不按预期方式增加/表现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40353769/

10-13 05:26