【问题标题】:Command line argument option with number offset带有数字偏移的命令行参数选项
【发布时间】:2014-12-03 21:52:50
【问题描述】:

我想确保 -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;   
}

【问题讨论】:

  • 使用getopt(),然后检查它与optarg 指向的内容是否为一位数(strlen(optarg) == 1 &amp;&amp; isdigit(optarg[0]))。即席参数解析将使您陷入各种即席问题。
  • 太棒了;感谢您的洞察力。我如何确保它位于“ -f ”选项之后...
  • int opt; while ((opt = getopt(argc, argv, "f:")) != -1) { switch (opt) { case 'f': …play with optarg…; break; default: …usage error and exit…; break; } } 是大纲代码。您不能保证您拥有-f3 或其他任何东西,但您的原始字符串比较不允许这样做。使用getopt(),您可以保证,如果您在命令行上有-f3-f 3,那么strcmp(optarg, "3") == 0。我很高兴地假设您只有 -f 参数;您需要更多代码来处理其他代码,无论它们是什么。
  • 太棒了,还有其他几个经过验证的参数。这给了我最大的挑战。非常感谢。

标签: c++ arguments option argv argc


【解决方案1】:

将 cmets 转录为答案

使用getopt() ,然后检查 optarg 所指向的内容是否为一位数 (strlen(optarg) == 1 &amp;&amp; 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 等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2020-07-20
    相关资源
    最近更新 更多