我想确保-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;
}
答案 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
等)。