C 如何确定getopt中参数的顺序和计数

C 如何确定getopt中参数的顺序和计数,c,macos,arguments,C,Macos,Arguments,我使用getopt从终端获取参数,但这取决于arguemts的顺序。两者之间是有区别的 ./my -A -B -C 及 有没有办法确定订单? 其次,我想确定arg的计数(若有一些可选的) ps对不起我的英语,我希望你理解我的意思你记录下getopt()返回它们的顺序。它以从左到右的顺序返回它们,因此不存在任何神秘之处。在第一次调用中,-A在-B之前报告,而-C在最后报告。在第二种情况下,-B报告在-A之前,而-C仍然是最后一种。您可以决定在读取参数时进行处理(以便在读取选项时执行操作),也可以

我使用getopt从终端获取参数,但这取决于arguemts的顺序。两者之间是有区别的

./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);