如何判断getopt中的optind值

时间:2016-08-01 03:39:43

标签: c linux

我只想测试全局变量optind并进行以下测试。如何判断optind的值?

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

int main(int argc, char *argv[])
{
    char optStr[] = "ab";
    int c;

    while ((c = getopt(argc, argv, optStr)) != -1) {
        printf("optind: %d\n", optind);
        switch (c) {
            case 'a':
                printf("-a\n"); 
                break;
            case 'b':
                printf("-b\n"); 
                break;
            case '?':
                printf("error\n");
                break;
          }
      }

    return 0;
}
  

./ a.out -ab

  optind:1
  -a
  optind:2
  -b

下:

  

./ a.out -a

  optind:2
  -a

2 个答案:

答案 0 :(得分:4)

here说:

  

变量optind是argv中要处理的下一个元素的索引。

以下是您看到的输出结果。

1)./a.out -ab将导致argv值:

argv[0]="./a.out"
argv[1]="-ab"
argv[2]=0
  • 开始:optind = 1
  • 首次getopt来电:处理选项a并且不更改optind。它保持为1,因为已处理a选项,但仍有b个选项。
  • 第二次getopt来电:处理选项b,现在optind设置为2,因为argv[1]中没有剩余选项。

现在是你的第二个例子。

2)./a.out -a将导致argv值:

argv[0]="./a.out"
argv[1]="-a"
argv[2]=0
  • 开始:optind = 1
  • 首次getopt来电:处理选项a并将optind设置为2,因为argv[1]中不再有选项。

答案 1 :(得分:0)

optind显示要在index数组中处理的next element argv

所以,当你./a.out -ab时:

评估a时,next element中要处理的argv仍为1,因为b尚未从{{1}进行评估}}

评估argv[1]时,b中要处理的next element为。{1}} argv,因为2已完全处理完毕。

执行argv[1]时:

评估./a.out -a时,要评估的anext element,因为2已完全处理。

如果您增加选择权,可以更清楚地看到这一点。 argv[1]。并将您的计划称为optstr[] = "abcdef;"。仅当评估最后一个选项(即./a.out -abcdef)时,optnid才会为2。另外,请致电f,了解./a.out -a -b -c如何在optnid数组中显示要处理的next element