C 使用getopt的多个整数参数?

C 使用getopt的多个整数参数?,c,getopt,C,Getopt,在使用getopt时,处理多个整数参数的最佳方法是什么?我必须能够在命令行中输入类似的内容:calc-a10050,它将加起来是100和50 while ((opt = getopt(argc, argv, "adms")) != -1) { value = atoi(argv[optind + 1]); printf("value : %d\n", value); switch (opt) { cas

在使用getopt时,处理多个整数参数的最佳方法是什么?我必须能够在命令行中输入类似的内容:
calc-a10050
,它将加起来是100和50

    while ((opt = getopt(argc, argv, "adms")) != -1)
    {

       value = atoi(argv[optind + 1]);
      printf("value : %d\n", value);

        switch (opt)
        {
        case 'a': aFlag = 1; num1 = atoi(argv[optind]);
                  sum = num1 + value;
                  printf("%d + %d =  %d\n" , num1, value, sum);
                  break;
        case 'd': dFlag = 1;
                  break;
        case 'm':  break;
        case 's':  break;
        default:
            fprintf(stderr, "%s: unknown option %c\n", argv[0], optopt);
return 1;
        }
    }

     if (aFlag == 1)
        {
                  num1 = atoi(argv[optind]);
                  sum = num1 + value;
                  printf("%d + %d =  %d\n" , num1, value, sum);
        }
     if (dFlag == 1)
        {
                  num2 = atoi(argv[optind]);
                  sub = num2 / value;
                  printf("%d / %d =  %d\n" , num2, value, sum);
        }
使用
getopt()
,一个选项最多只能接受一个参数。如果希望程序使用
getopt()
处理其命令行,并且必须接受您描述的参数

,并且您不能重复选项,那么唯一可行的解决方案是将一个或两个整数设置为非选项参数,而不是将参数设置为
-a
选项。我建议提出两个(或全部)非选项论点。因此,您可能会遇到如下情况:

int result = getopt(argc, argv, "asmd");

switch (result) {
    case 'a':
        // careful: getopt() will be confused by negative numbers
        if (getopt(argc, argv, "asmd") != -1) {
            fprintf(stderr, "usage: %s -a|-s|-m|-d <operands>\n", argv[0]);
            exit(1);
        }
        do_add(argv + optind);
        break;

    case 's':
        // ...
}
int result=getopt(argc,argv,“asmd”);
开关(结果){
案例“a”:
//小心:getopt()会被负数混淆
如果(getopt(argc、argv、asmd)!=-1){
fprintf(stderr,“用法:%s-a |-s |-m |-d\n”,argv[0]);
出口(1);
}
添加(argv+optind);
打破
案例s:
// ...
}
getopt()
返回-1之后,
optind
argv
中的索引,比最后处理的选项(+/-option参数)的索引多一个。

使用
getopt()
,一个选项最多可以接受一个参数。如果希望程序使用
getopt()
处理其命令行,并且必须接受您描述的参数

,并且您不能重复选项,那么唯一可行的解决方案是将一个或两个整数设置为非选项参数,而不是将参数设置为
-a
选项。我建议提出两个(或全部)非选项论点。因此,您可能会遇到如下情况:

int result = getopt(argc, argv, "asmd");

switch (result) {
    case 'a':
        // careful: getopt() will be confused by negative numbers
        if (getopt(argc, argv, "asmd") != -1) {
            fprintf(stderr, "usage: %s -a|-s|-m|-d <operands>\n", argv[0]);
            exit(1);
        }
        do_add(argv + optind);
        break;

    case 's':
        // ...
}
int result=getopt(argc,argv,“asmd”);
开关(结果){
案例“a”:
//小心:getopt()会被负数混淆
如果(getopt(argc、argv、asmd)!=-1){
fprintf(stderr,“用法:%s-a |-s |-m |-d\n”,argv[0]);
出口(1);
}
添加(argv+optind);
打破
案例s:
// ...
}

getopt()
返回-1之后,
optind
argv
中的索引,比上一个处理的选项(+/-option参数)的索引高出一倍。

我想您要找的接口可能是:

./program -a 100 50
它接受单个选项
-a
(可选选项
-m
-s
-d
),然后将其他参数作为数字列表处理,而不是作为附加到选项的值处理。除非您计划能够使用:

./program -a 100 50 -m 20 30
做加法和乘法

如果有人拿不定主意,你会怎么做:

./program -am 100 50
这是一个错误,还是应该
-a
-m
获胜?你可以为任何一个有一定程度一致性的人辩护。不过,我还是会出错的

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static int op_add(int a, int b) { return a + b; }
static int op_sub(int a, int b) { return a - b; }
static int op_mul(int a, int b) { return a * b; }
static int op_div(int a, int b) { return a / b; }

int main(int argc, char **argv)
{
    int (*fun)(int, int) = 0;
    char op;
    int opt;

    while ((opt = getopt(argc, argv, "adms")) != -1)
    {
        if (fun != 0)
        {
            fprintf(stderr, "%s: you can't use two operations\n", argv[0]);
            return 1;
        }
        switch (opt)
        {
        case 'a': fun = op_add; op = '+'; break;
        case 'd': fun = op_div; op = '/'; break;
        case 'm': fun = op_mul; op = '*'; break;
        case 's': fun = op_sub; op = '-'; break;
        default:
            fprintf(stderr, "%s: unknown option %c\n", argv[0], optopt);
            return 1;
        }
    }
    if (fun == 0 || optind + 2 != argc)
    {
        fprintf(stderr, "Usage: %s [-adms] num1 num2\n", argv[0]);
        return 1;
    }

    int res = fun(atoi(argv[optind]), atoi(argv[optind+1]));
    printf("%s %c %s = %d\n", argv[optind], op, argv[optind+1], res);
    return 0;
}

为了防止您不确定,
int(*fun)(int,int)
是一个指向函数的指针,该函数接受两个
int
参数并返回一个
int
结果。它允许代码在运行时选择要执行的函数。

我认为您所追求的界面可能是:

./program -a 100 50
它接受单个选项
-a
(可选选项
-m
-s
-d
),然后将其他参数作为数字列表处理,而不是作为附加到选项的值处理。除非您计划能够使用:

./program -a 100 50 -m 20 30
做加法和乘法

如果有人拿不定主意,你会怎么做:

./program -am 100 50
这是一个错误,还是应该
-a
-m
获胜?你可以为任何一个有一定程度一致性的人辩护。不过,我还是会出错的

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static int op_add(int a, int b) { return a + b; }
static int op_sub(int a, int b) { return a - b; }
static int op_mul(int a, int b) { return a * b; }
static int op_div(int a, int b) { return a / b; }

int main(int argc, char **argv)
{
    int (*fun)(int, int) = 0;
    char op;
    int opt;

    while ((opt = getopt(argc, argv, "adms")) != -1)
    {
        if (fun != 0)
        {
            fprintf(stderr, "%s: you can't use two operations\n", argv[0]);
            return 1;
        }
        switch (opt)
        {
        case 'a': fun = op_add; op = '+'; break;
        case 'd': fun = op_div; op = '/'; break;
        case 'm': fun = op_mul; op = '*'; break;
        case 's': fun = op_sub; op = '-'; break;
        default:
            fprintf(stderr, "%s: unknown option %c\n", argv[0], optopt);
            return 1;
        }
    }
    if (fun == 0 || optind + 2 != argc)
    {
        fprintf(stderr, "Usage: %s [-adms] num1 num2\n", argv[0]);
        return 1;
    }

    int res = fun(atoi(argv[optind]), atoi(argv[optind+1]));
    printf("%s %c %s = %d\n", argv[optind], op, argv[optind+1], res);
    return 0;
}

为了防止您不确定,
int(*fun)(int,int)
是一个指向函数的指针,该函数接受两个
int
参数并返回一个
int
结果。它允许代码选择在运行时执行哪个函数。

此摘录自
getopt()
的手册页,清楚地表明每个答案(以及原始问题)都没有显示对
getopt
的理解:

optstring是包含合法选项字符的字符串。
如果这样的字符后跟冒号, [然后]选项需要一个参数, 因此getopt()放置一个指针 到同一argv元素中的以下文本,
或以下argv元素的文本, 在optarg

您的代码还应考虑以下内容:

如果getopt()无法识别选项字符, 它会向stderr打印一条错误消息, 将字符存储在optopt中,
并返回“?”

最后,这将允许
-
位于命令行的任何位置:

默认情况下,getopt()在扫描argv时排列argv的内容,以便
最后,所有的非选项都结束了。

这段摘自
getopt()
手册页的摘录清楚地表明,每个答案(以及原始问题)都没有显示出对
getopt
的理解:

optstring是包含合法选项字符的字符串。
如果这样的字符后跟冒号, [然后]选项需要一个参数, 因此getopt()放置一个指针 到同一argv元素中的以下文本,
或以下argv元素的文本, 在optarg

您的代码还应考虑以下内容:

如果getopt()无法识别选项字符, 它会向stderr打印一条错误消息, 将字符存储在optopt中,
并返回“?”

最后,这将允许
-
处于任何位置o