带数字偏移的命令行参数选项

时间:2014-10-09 04:37:12

标签: c++ arguments option argv argc

我想确保-f之后的选项/参数是0-9之间的数字。总共必须有10个参数,任何顺序。唯一的条件是-f必须跟一个数字。

/* Ensure that the -f option is included in the arguments
and it is preceeded by valid digit between 0 -9 */
int Crypto::offsetValidation( int argc, char *argv[] )
{
    for( int i = 0; i < argc; i++ )
    {
        if(argv[i] == string("-f"))             
        {           
            cout << "offset" << endl;           
            return offset;
        }       
    }   

    cout << "Usage: -f is required for offset" << endl;
    exit(EXIT_FAILURE);

    return 0;   
}

1 个答案:

答案 0 :(得分:1)

将评论转录成答案

使用getopt() ,然后检查它与optarg指向的是一位数字(strlen(optarg) == 1 && isdigit(optarg[0]))。临时参数解析将引导您进入各种临时问题。

  

我如何确保它正好在“-f”选项之后......

您可以编写类似于以下内容的代码:

int opt;
while ((opt = getopt(argc, argv, "f:")) != -1)
{
    switch (opt)
    {
    case 'f':
        if (strlen(optarg) == 1 && isdigit(optarg[0]))
            f_value = optarg[0] - '0';
        else
            err_exit("Invalid value '%s' for -f option", optarg);
        break;
    default:
        …usage error and exit…;
        break;
    }
}

您无法保证拥有-f3或其他任何内容,但原始字符串比较不允许这样做。使用getopt(),您可以确保在命令行中有-f3-f 3,然后strcmp(optarg, "3") == 0。我很乐意假设你只有-f个论点;你需要更多代码来处理其他代码,无论它们是什么。您需要将额外的选项字母添加到当前包含"f:"的字符串,以及交换机的额外情况以及处理它们的变量。

我还应该补充一点,这是可以用C ++而不是'真正的C ++'编译的C代码。有一个Boost库用于解析C ++中的选项,这可能是一个更好的选择 - 如果你被允许在你的项目中使用Boost。一般来说,还有许多其他选项解析器。 GNU getopt_long()也广泛用于长选项名称解析(--file name-of-file等)。