example ejemplo c input getopt

ejemplo - C getopt valor mĂșltiple



getopt c ejemplo (4)

Mi argumento es así.

./a.out -i file1 file2 file3

¿Cómo puedo utilizar getopt() para obtener 3 (o más) archivos de entrada? Estoy haciendo algo como esto:

while ((opt = getopt(argc, argv, "i:xyz.."))!= -1){ case ''i'': input = optarg; break; ... }

Recibo solo el file1 ; ¿Cómo obtener file2 , file3 ?


Busqué y probé el código anterior, pero encontré mi solución un poco más fácil y me funcionó mejor:

El manejo que quería era:

-m mux_i2c_group mux_i2c_out

(Se requieren 2 argumentos).

Así es como se concretó para mí:

case ''m'': mux_i2c_group = strtol(optarg, &ch_p, 0); if (optind < argc && *argv[optind] != ''-''){ mux_i2c_out = strtol(argv[optind], NULL, 0); optind++; } else { fprintf(stderr, "/n-m option require TWO arguments <mux_group> " "<mux_out>/n/n"); usage(); } use_mux_flag = 1; break;

Esto tomó el primer valor de mi forma normal y luego solo buscó el segundo valor REQUERIDO.


Sé que esto es bastante antiguo, pero encontré 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 siguiente posición después del '' argv actual'' seleccionado por getopt () ; Por eso lo disminuyo al principio.

En primer lugar, para verificaciones de bucles si el valor del argumento actual está dentro de los límites de argv ( argc es la longitud de la matriz, por lo que la última posición en la matriz argv es argc-1 ). La segunda parte de && compara si el primer carácter del siguiente argumento es ''-''. Si el primer carácter es ''-'', nos quedamos sin los siguientes valores para el argumento actual else argv [optind] es nuestro siguiente valor. Y así hasta que el argumento argv haya terminado o el argumento se quede sin valores.

Al final, haga clic en optind para buscar el siguiente argumento.

Tenga en cuenta que, dado que estamos verificando que '' optind <argc '', la primera parte de la condición no se ejecutará a menos que la primera parte sea verdadera, por lo que no se preocupe por leer fuera de los límites de la matriz.

PD: soy un programador de C bastante nuevo si alguien tiene mejoras o críticas, por favor compártalas.


Si debe hacerlo, puede comenzar en argv[optind] e incrementarse optind usted mismo. Sin embargo, recomendaría esto, ya que considero que la sintaxis es pobre. (¿Cómo sabrías cuándo has llegado al final de la lista? ¿Qué sucede si alguien tiene un archivo con el nombre - como primer carácter?)

Creo que aún sería mejor cambiar tu sintaxis a:

/a.out -i file1 -i file2 -i file3

O para tratar la lista de archivos como parámetros posicionales:

/a.out file1 file2 file3


Tenga en cuenta que la extensión de permutación de argumentos no conformes de glibc interrumpirá cualquier intento de usar múltiples argumentos para -i de esta manera. Y en los sistemas que no son GNU, el "segundo argumento de -i " se interpretará como el primer argumento sin opción, lo que detendrá cualquier otra opción de análisis. Con estos problemas en mente, getopt y escribiría su propio analizador de línea de comandos si desea usar esta sintaxis, ya que no es una sintaxis compatible con getopt .