getopt 的多个整数参数?
Multiple integer arguments with getopt?
使用 getopt 时处理多个整数参数的最佳方法是什么?我必须能够在命令行中输入类似这样的内容:calc -a 100 50
,它会将 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()
处理其命令行,并且它必须接受您描述的参数
calc -a 100 50
,并且你不能重复选项,那么唯一可行的解决方案是使一个或两个整数 非选项参数 而不是参数 -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':
// ...
}
在 getopt()
returns -1 之后,optind
是 argv
中最后一个选项(+/- 选项参数)处理后的索引。
我认为你想要的界面可能是:
./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;
}
对 'numeric' 参数中值的错误检查是草率的(意思是,不存在)。也没有除以零检查。但这至少会产生似是而非的答案。保存函数指针和运算字符的结构数组可能会更好,但那种细化是你要处理的。
如果需要负数,用--
标记选项结束:
$ ./program -m -- -39 -75
-39 * -75 = 2925
$
以防万一您不确定,int (*fun)(int, int)
是一个指向函数的指针,该函数接受两个 int
参数和 returns 一个 int
结果。它允许代码 select 在运行时执行哪个函数。
getopt()
的手册页摘录清楚地表明每个答案(和原始问题)都没有表现出对 getopt
的理解:
optstring 是包含合法选项字符的字符串。
如果这样的字符后跟一个冒号,
[然后] 该选项需要一个参数,
所以 getopt() 放置一个指针
到同一 argv 元素中的以下文本,
或以下 argv 元素的文本,
在 optarg.
您的代码还应允许以下内容:
如果 getopt() 不识别选项字符,
它向 stderr 打印一条错误消息,
将字符存储在 optopt 中,
和 returns '?'.
最后是这个(这将允许 -
位于命令行上的任何位置:
默认情况下,getopt() 在扫描时置换 argv 的内容,因此
最终所有的非选项都在最后。
使用 getopt 时处理多个整数参数的最佳方法是什么?我必须能够在命令行中输入类似这样的内容:calc -a 100 50
,它会将 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()
处理其命令行,并且它必须接受您描述的参数
calc -a 100 50
,并且你不能重复选项,那么唯一可行的解决方案是使一个或两个整数 非选项参数 而不是参数 -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':
// ...
}
在 getopt()
returns -1 之后,optind
是 argv
中最后一个选项(+/- 选项参数)处理后的索引。
我认为你想要的界面可能是:
./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;
}
对 'numeric' 参数中值的错误检查是草率的(意思是,不存在)。也没有除以零检查。但这至少会产生似是而非的答案。保存函数指针和运算字符的结构数组可能会更好,但那种细化是你要处理的。
如果需要负数,用--
标记选项结束:
$ ./program -m -- -39 -75
-39 * -75 = 2925
$
以防万一您不确定,int (*fun)(int, int)
是一个指向函数的指针,该函数接受两个 int
参数和 returns 一个 int
结果。它允许代码 select 在运行时执行哪个函数。
getopt()
的手册页摘录清楚地表明每个答案(和原始问题)都没有表现出对 getopt
的理解:
optstring 是包含合法选项字符的字符串。
如果这样的字符后跟一个冒号,
[然后] 该选项需要一个参数,
所以 getopt() 放置一个指针
到同一 argv 元素中的以下文本,
或以下 argv 元素的文本,
在 optarg.
您的代码还应允许以下内容:
如果 getopt() 不识别选项字符,
它向 stderr 打印一条错误消息,
将字符存储在 optopt 中,
和 returns '?'.
最后是这个(这将允许 -
位于命令行上的任何位置:
默认情况下,getopt() 在扫描时置换 argv 的内容,因此 最终所有的非选项都在最后。