Я знаю, что это довольно старо, но я столкнулся с этим в поисках решения.
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 () ) указывает на следующую позицию после 'current argv ', выбранного с помощью getopt () ;Вот почему я уменьшаю его в начале.
Прежде всего for loop проверяет, находится ли значение текущего аргумента в границах argv ( argc - длина массива, последняяпозиция в массиве argv равна argc-1 ).Вторая часть && сравнивает, является ли первый символ следующего аргумента '-'.Если первый символ равен '-', то у нас заканчиваются следующие значения для текущего аргумента, иначе argv [optind] является нашим следующим значением.И так до тех пор, пока argv не закончится или аргумент не закончится со значениями.
В конце увеличьте optind , чтобы проверить следующий аргумент argv.
Обратите внимание, потому что мыпроверка ' optind ' первой второй части условия не будет выполнена, если только первая часть не истинна, поэтому не стоит беспокоиться о чтении за пределами границ массива.
PS Я совершенно новый программист на C, если у кого-то есть улучшения или критика, пожалуйста, поделитесь им.