c-在检查选项之前处理getopt中的非选项参数



我正在编写一个程序,希望在检查标志之前获得非选项参数。

例如,如果参数是./a.out -a -b 50 filename

我想使用filename,然后根据标志执行task_a()和/或task_b()filename可以是argv[]中的任何自变量

int opt;
float value;
while ((opt = getopt(argc, argv, "ab:")) != -1)
case 'a':
task_a(filename);
break;
case 'b':
value = atof(optarg);
task_b(filename, value);
break;

因此,基本上,在将filename用于我的任务之前,我需要提取它。我该如何实现?

getopt将按照在命令行中找到命令行参数的顺序向您传递命令行参数。这通常不是您想要处理它们的顺序。

相反,在执行操作之前,让您的程序首先设置其选项,因此类似于(给定#include<stdbool.h>(:

// Set the defaults
bool doTaskA = false;
book doTaskB = false;
float brightness = -1;
int opt;
float value;
while ((opt = getopt(argc, argv, "ab:")) != -1) {
case 'a':
doTaskA = true;
break;
case 'b':
doTaskB = true;
brightness = atof(optarg);
break;
}
filename = ....,,
if (doTaskA) {
task_a(filename);
}
if (doTaskB) {
task_b(filename, brightness);
}

我选择了"亮度"这个名称作为一个有意义的属性名称——当然你应该选择自己的名称。作为一种好的做法,不要将变量命名为"optionA",或者一些这样的变量名称应该描述它们是什么,而不是具体的实现细节。

始终想象你的选项可以随着时间的推移而改变字母(现在的选项"a"可能在六个月后变成选项"R"(——除了"getopt"参数和"case"语句之外,这种改变不应该影响任何事情。

已编辑以更改:我最初是用"if(brightness>=0.0("来写这篇文章的,但我决定,通常情况下,单独的doTaskB变量是更干净、更明确的方法,不会限制参数的可能值。

最新更新