Я знаю, что это довольно старо, но я наткнулся на это в поисках решения.
while((command = getopt(argc, argv, "a:")) != -1){
switch(command){
case 'a':
(...)
optind--;
for( ;optind < argc && *argv[optind] != '-'; optind++){
DoSomething( argv[optind] );
}
break;
}
Я обнаружил, что int optind (extern, используемый getopt() ) указывает на следующую позицию после «текущего argv», выбранного getopt (); Вот почему я уменьшаю его в начале.
Прежде всего цикл for проверяет, находится ли значение текущего аргумента в пределах границ argv (argc — это длина массива, поэтому последняя позиция в массиве argv равен argc-1). Вторая часть && сравнивает, равен ли первый символ следующего аргумента '-'. Если первый символ равен '-', то у нас заканчиваются следующие значения для текущего аргумента, иначе argv[optind] является нашим следующим значением. И так до тех пор, пока argv не закончится или в аргументе не закончатся значения.
В конце увеличьте optind для проверки следующего аргумента.
Обратите внимание, что поскольку мы проверяем 'optind ‹ argc', первая вторая часть условия не будет выполнена, пока первая часть не станет истинной, поэтому не беспокойтесь о чтении за пределами массива.
PS Я совсем новый программист на C, если у кого-то есть улучшения или критические замечания, поделитесь ими.
person
GoTTimw
schedule
02.11.2011
getopt()
предоставляет некоторые возможности, не упомянутые здесь. - person Jonathan Leffler   schedule 05.06.2014optind
в коде программы ходят по тонкому льду. Нет задокументированных требований, чтобыgetopt()
вел себя, если вы изменяетеoptind
илиoptarg
в вызывающем коде. Конечно, большинство современных и правдоподобных реализаций не будут иметь проблем, но гипотетическая реализация может записывать свое внутреннее состояние в неглобальные переменные и просто устанавливать глобальные переменные по мере возврата. Такая реализация соответствовала бы спецификации POSIX дляgetopt()
, но показано не будет работать. - person Jonathan Leffler   schedule 05.06.2014