0

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

1 回答 1

1

将评论转录为答案

使用getopt() ,然后检查它所指向的optarg是否是一位数 ( strlen(optarg) == 1 && isdigit(optarg[0]))。即席参数解析将使您陷入各种即席问题。

我如何确保它位于“ -f ”选项之后……</p>

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

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 代码。有一个用于解析 C++ 选项的Boost库可能是一个更好的选择——如果你被允许在你的项目中使用 Boost。通常还有许多其他选项解析器。GNUgetopt_long()也广泛用于长选项名称解析(--file name-of-file等)。

于 2014-10-09T05:38:06.427 回答