根据我将选项传递给此程序的格式,变量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/