2016-08-01 135 views
2

我只是想测试全局变量optind并做下面的测试。如何判断optind的价值?如何判断optind在getopt中的值

#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

+0

“法官”是什么意思? – immibis

+0

@immibis optind的价值是什么?也许“评判”不是很准确。 – hel

回答

0

optind示出的next elementindexargv阵列进行处理。


所以,当你做./a.out -ab

a进行评估时,next element要在argv处理仍1,因为b没有从argv[1]尚未评估。

b时被评估,则next element要在argv处理是 2,因为argv[1]被完全处理。


当你这样做./a.out -a

a进行评估时,next element评价是2因为argv[1]被完全处理。


如果您增加选项以说明,则可以更清楚地看到这一点。 optstr[] = "abcdef;"。并称你的程序为./a.out -abcdef。仅当最后一个选项 - 即f - 被评估时,optnid将为2。另请致电./a.out -a -b -c查看optnid如何显示要在argv阵列中处理的next element

2

getopt man page说:

可变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]