C getopt()函数-optin未按预期递增/运行
根据我向该程序传递选项的格式,变量C getopt()函数-optin未按预期递增/运行,c,command-line,C,Command Line,根据我向该程序传递选项的格式,变量optind将正确递增以反映下一个选项值,或者不递增 如果我使用/cfind-aru,我会得到以下(奇怪的)输出 请注意,optind不会从aflag增加到rflag,而是从rflag增加到uflag 但是,当我使用格式./cfind-a-r-u时,我会得到以下(预期的)输出 这是我想要的输出 我的这个函数代码如下 #include "cfind.h" #define OPTLIST "acdirstu" // list of valid options vo
optind
将正确递增以反映下一个选项值,或者不递增
如果我使用/cfind-aru
,我会得到以下(奇怪的)输出
请注意,optind不会从aflag增加到rflag,而是从rflag增加到uflag
但是,当我使用格式./cfind-a-r-u时,我会得到以下(预期的)输出
这是我想要的输出
我的这个函数代码如下
#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
,我有什么误解吗
谢谢。手册页上写着(我的重点):
变量optind是argv中要处理的下一个元素的索引
您的调用选项-aru
都作为单个字符串包含在argv[1]
手册页上(强调我的):
变量optind是argv中要处理的下一个元素的索引
您的调用选项
-aru
都作为单个字符串包含在argv[1]
中,我觉得输出是正确的
optind
是要处理的下一个参数的索引。当所有选项都在一起时,它们都在argv[1]
中,因此optin
在处理u
选项之前保持为1。此时,由于argv[1]
中的所有内容都已被使用,optind
被设置为2
当所有选项都位于argv
的单独元素中时,optind
始终是要处理的下一个参数的索引
请参阅。我认为输出是正确的
optind
是要处理的下一个参数的索引。当所有选项都在一起时,它们都在argv[1]
中,因此optin
在处理u
选项之前保持为1。此时,由于argv[1]
中的所有内容都已被使用,optind
被设置为2
当所有选项都位于argv
的单独元素中时,optind
始终是要处理的下一个参数的索引
请参阅。将此项放在程序的开头,以查看正在进行的操作:
for (int i = 0; i < argc; ++i)
printf("Param %d: %s\n", i, argv[i]);
for(int i=0;i
将此项放在程序的开头,以查看发生了什么:
for (int i = 0; i < argc; ++i)
printf("Param %d: %s\n", i, argv[i]);
for(int i=0;i
#包括#包括
外部字符*optarg;
外部-内部选项;
int main(int argc,字符**argv){
INTC;
printf(“-----------选项:------------\n”);
而((c=getopt(argc,argv,abcd:)!=-1){
printf(“opt:%c arg%s\n”,(char)c,optarg);
}
argc-=optind-1;
argv+=optind-1;
printf(“----剩余参数:-----\n”);
对于(int i=1;i
#包括#包括
外部字符*optarg;
外部-内部选项;
int main(int argc,字符**argv){
INTC;
printf(“-----------选项:------------\n”);
而((c=getopt(argc,argv,abcd:)!=-1){
printf(“opt:%c arg%s\n”,(char)c,optarg);
}
argc-=optind-1;
argv+=optind-1;
printf(“----剩余参数:-----\n”);
对于(int i=1;i
for (int i = 0; i < argc; ++i)
printf("Param %d: %s\n", i, argv[i]);
#include <stdio.h> #include <unistd.h>
extern char *optarg;
extern int optind;
int main (int argc, char** argv) {
int c;
printf("--------- options: ---------\n");
while ((c = getopt (argc,argv,"abcd:")) != -1) {
printf("opt: %c arg %s\n", (char)c, optarg);
}
argc -= optind - 1;
argv += optind - 1;
printf("------ remaining args: ------\n");
for (int i = 1; i < argc; i++) {
printf("argv[%d] = %s\n", i, argv[i]);
}
}