У меня есть программа, которая принимает различные аргументы командной строки. Для упрощения скажем, что для этого требуется 3 флага: -a
, -b
и -c
, и для анализа моих аргументов используется следующий код:
int c;
while((c = getopt(argc, argv, ":a:b:c")) != EOF)
{
switch (c)
{
case 'a':
cout << optarg << endl;
break;
case 'b':
cout << optarg << endl;
break;
case ':':
cerr << "Missing option." << endl;
exit(1);
break;
}
}
примечание: a и b принимают параметры после флага.
Но я сталкиваюсь с проблемой, если я вызываю мою программу скажем с
./myprog -a -b parameterForB
там, где я забыл параметрForA, параметрForA (представленный optarg) возвращается как -b
, а параметрForForB считается опцией без параметра, а для optind устанавливается индекс параметраForB в argv.
Желаемое поведение в этой ситуации: ':'
возвращается после того, как не найден аргумент для -a
, а Missing option.
выводится со стандартной ошибкой. Однако это происходит только в том случае, если -a
является последним параметром, переданным в программу.
Я предполагаю, что вопрос: есть ли способ заставить getopt()
предполагать, что никакие опции не начнутся с -
?