在检查选项之前处理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 ):

// 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变量是更简洁,更明确的方法,而不限制参数的可能值。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...