C 如何确定getopt中参数的顺序和计数
我使用getopt从终端获取参数,但这取决于arguemts的顺序。两者之间是有区别的C 如何确定getopt中参数的顺序和计数,c,macos,arguments,C,Macos,Arguments,我使用getopt从终端获取参数,但这取决于arguemts的顺序。两者之间是有区别的 ./my -A -B -C 及 有没有办法确定订单? 其次,我想确定arg的计数(若有一些可选的) ps对不起我的英语,我希望你理解我的意思你记录下getopt()返回它们的顺序。它以从左到右的顺序返回它们,因此不存在任何神秘之处。在第一次调用中,-A在-B之前报告,而-C在最后报告。在第二种情况下,-B报告在-A之前,而-C仍然是最后一种。您可以决定在读取参数时进行处理(以便在读取选项时执行操作),也可以
./my -A -B -C
及
有没有办法确定订单?
其次,我想确定arg的计数(若有一些可选的)
ps对不起我的英语,我希望你理解我的意思你记录下
getopt()
返回它们的顺序。它以从左到右的顺序返回它们,因此不存在任何神秘之处。在第一次调用中,-A
在-B
之前报告,而-C
在最后报告。在第二种情况下,-B
报告在-A
之前,而-C
仍然是最后一种。您可以决定在读取参数时进行处理(以便在读取选项时执行操作),也可以按选项出现的顺序存储选项,并在完全读取选项后进行处理。两者都是可行的。但是,如果第一种技术出现错误,那么早期处理就已经完成了。如果无法接受,请先处理所有选项
您可以很容易地计算循环中选项参数的数量:
int optcnt = 0;
int opt;
while ((opt = getopt(argc, argv, "ABC")) != -1)
optcnt++;
你可能会在大括号内有一个带开关的循环,也可能有一个简单的增量
请注意,您可以有重复的选项,每次都可能有不同的选项值:
./my -D name1 -D name2 -A -B -D name3 -C
您可以保留按顺序显示的选项和名称的记录
int optcnt = 0;
int opt;
int o_idx = 0;
int d_idx = 0;
char *d_opts[20];
char o_opts[20];
while ((opt = getopt(argc, argv, "ABCD:")) == -1)
{
optcnt++;
switch (opt)
{
case 'A':
case 'B':
case 'C':
o_opts[o_idx++] = opt;
break;
case 'D':
o_opts[o_idx++] = opt;
d_opts[d_idx++] = optarg;
break;
default:
…report error and exit…
break;
}
}
/* Parsing complete - do final checks */
/* Processing loop */
int d = 0;
int i;
for (i = 0; i < o_idx; i++)
{
switch (o_opts[i])
{
case 'A':
process_A();
break;
case 'B':
process_B();
break;
case 'C':
process_C();
break;
case 'D':
process_D(d_opts[d++]);
break;
}
}
assert(d == d_idx && i == o_idx);
int optcnt=0;
int-opt;
int o_idx=0;
int d_idx=0;
char*d_选项[20];
charo_选项[20];
而((opt=getopt(argc,argv,“ABCD:”)=-1)
{
optcnt++;
开关(opt)
{
案例“A”:
案例“B”:
案例“C”:
o_opts[o_idx++]=opt;
打破
案例“D”:
o_opts[o_idx++]=opt;
d_opts[d_idx++]=optarg;
打破
违约:
…报告错误并退出…
打破
}
}
/*解析完成-执行最终检查*/
/*处理循环*/
int d=0;
int i;
对于(i=0;i
重新设置
getopt()
回到开头是一种未经记录的艺术;尽量不需要重新分析命令行。将argv[]作为参数传递给main(),它包含指向字符串的指针数组。这些字符串与它们在命令行中的顺序完全相同。确定某个参数是否在另一个参数之前列出的方法。
是单步遍历argv[]字符串
int optcnt = 0;
int opt;
int o_idx = 0;
int d_idx = 0;
char *d_opts[20];
char o_opts[20];
while ((opt = getopt(argc, argv, "ABCD:")) == -1)
{
optcnt++;
switch (opt)
{
case 'A':
case 'B':
case 'C':
o_opts[o_idx++] = opt;
break;
case 'D':
o_opts[o_idx++] = opt;
d_opts[d_idx++] = optarg;
break;
default:
…report error and exit…
break;
}
}
/* Parsing complete - do final checks */
/* Processing loop */
int d = 0;
int i;
for (i = 0; i < o_idx; i++)
{
switch (o_opts[i])
{
case 'A':
process_A();
break;
case 'B':
process_B();
break;
case 'C':
process_C();
break;
case 'D':
process_D(d_opts[d++]);
break;
}
}
assert(d == d_idx && i == o_idx);