Sé que esto es bastante antiguo, pero me encontré con esto en mi búsqueda de una solución.
while((command = getopt(argc, argv, "a:")) != -1){
switch(command){
case 'a':
(...)
optind--;
for(;optind < argc && *argv[optind] != '-'; optind++){
DoSomething(argv[optind]);
}
break;
}
encontré que int optind (extern utilizado por getopt()) apunta a la próxima posición después de la 'actual argv' seleccionado por getopt(); Es por eso que lo disminuyo al principio.
Primero de todo para bucle comprueba si el valor del argumento actual está dentro de límites de argv (argc es la longitud de matriz de modo última posición en array argv es argc-1). Segunda parte de & & se compara si el primer carácter del siguiente argumento es '-'. Si el primer carácter es '-', entonces nos quedamos sin los siguientes valores para el argumento actual, sino que argv [optind] es nuestro próximo valor. Y así sucesivamente hasta que el argv haya terminado o la discusión se quede sin valores.
Al final del incremento optind para verificar la siguiente argv.
Tenga en cuenta que debido a que estamos comprobando 'optind < argc' primera segunda parte de la condición no se ejecutará a menos primera parte es verdadero lo que no se preocupa de la lectura fuera de los límites de la matriz.
PD Soy un programador de C bastante nuevo, si alguien tiene alguna mejora o crítica, por favor compártelo.
Tenga en cuenta que la cuestión [Suministro de dos argumentos para la opción de línea de comandos usando 'getopt()'] (http: // stackoverflow. com/questions/8559391/supplying-two-arguments-to-command-line-option-using-getopt /) proporciona algunas posibilidades que no se mencionan aquí. –
Las respuestas a continuación que modifican 'optind' en el código del programa están pisando hielo delgado. No existe ningún requisito documentado de que 'getopt()' se comporte si modifica 'optind' u' optarg' en el código de llamada. De acuerdo, la mayoría de las implementaciones actuales y plausibles no tendrán un problema, pero una implementación hipotética podría registrar su estado interno en variables no globales, y simplemente establecer las globales a medida que regresa. Dicha implementación cumpliría con la especificación POSIX para ['getopt()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getopt.html), pero el retoque que se muestra no funcionaría. –