我只想测试全局变量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
答案 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
时,要评估的a
为next element
,因为2
已完全处理。
如果您增加选择权,可以更清楚地看到这一点。 argv[1]
。并将您的计划称为optstr[] = "abcdef;"
。仅当评估最后一个选项(即./a.out -abcdef
)时,optnid
才会为2
。另外,请致电f
,了解./a.out -a -b -c
如何在optnid
数组中显示要处理的next element
。