Я хочу убедиться, что параметр / аргумент после -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 && 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 ++». Есть Увеличение библиотека для разбора опций в C ++, которая может быть лучшим выбором — если вам разрешено использовать Boost в вашем проекте. Есть также много других парсеров опций в целом. GNU getopt_long()
также широко используется для разбора длинных опций (--file name-of-file
так далее).