Cómo se asigna la variable optind en C
-
Utilice la función
getopt
para analizar las opciones de la línea de comandos en C -
Utilice las variables
optind
yoptarg
para procesar elementosargv
en C
Este artículo demostrará varios métodos sobre cómo se asigna la variable optind
en C.
Utilice la función getopt
para analizar las opciones de la línea de comandos en C
Los programas de línea de comandos típicos en sistemas basados en UNIX toman argumentos y opciones. Las opciones generalmente se especifican con caracteres que siguen a guiones, y cada carácter único indica información sobre el argumento dado o produce el comportamiento específico del programa que se ejecutará. Las opciones pueden tener argumentos obligatorios u opcionales; en el último caso, es común que los programas permitan agrupar las opciones después de un solo guion y el único argumento se puede pasar al final del comando.
La función getopt
se utiliza para analizar las opciones y recuperar los argumentos dados del programa, y ejecutar las rutas de código correspondientes basadas en la entrada. getopt
toma tres argumentos, los dos primeros de los cuales son argc
y argv
pasados a la función main
. El tercer argumento es optstring
, un puntero a una cadena de caracteres que representa los caracteres de opción legítimos. getopt
debe llamarse sucesivamente hasta que se recuperen todas las opciones.
En el siguiente ejemplo, demostramos un programa que toma opciones con caracteres p
y x
. Tenga en cuenta que optstring
comienza con dos puntos, lo que indica el valor que debe devolver la llamada getopt
cuando se encuentran los argumentos que faltan. Además, dos puntos especificados después de un carácter (por ejemplo, p
) indica que el argumento es necesario para la opción; dos dos puntos significa que el argumento es opcional. El mismo carácter de opción se puede pasar varias veces en la línea de comandos. La función getopt
devuelve el carácter de opción si tiene éxito o devuelve el carácter ?
si el carácter de opción encontrado no está en optstring
.
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int opt, xnum = 0;
char *pstr = NULL;
while ((opt = getopt(argc, argv, ":p:x")) != -1) {
printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);
switch (opt) {
case 'p':
pstr = optarg;
break;
case 'x':
xnum++;
break;
case ':':
fprintf(stderr,
"Missing argument!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
case '?':
fprintf(stderr,
"Unrecognized option!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
default:
fprintf(stderr, "Unexpected case in switch()");
exit(EXIT_FAILURE);
}
}
exit(EXIT_SUCCESS);
}
Comando de muestra:
./program_name -p hello -p there
Producción :
opt = 112 (p); optind = 3
opt = 112 (p); optind = 5
Utilice las variables optind
y optarg
para procesar elementos argv
en C
El ejemplo de código anterior demuestra el uso típico de getopt
, donde la función se llama desde una expresión de bucle while
hasta que devuelve el código de error -1
. Mientras tanto, la instrucción switch
comprueba los posibles valores de retorno de getopt
para ejecutar los bloques de código correspondientes. Tenga en cuenta que la variable optind
representa el índice del siguiente elemento en el argv
, y se inicializa en 1
antes de la primera llamada a getopt
. Por otro lado, optarg
es una variable externa que apunta al argumento que sigue al carácter de la opción actual. Si la opción no incluye un argumento, entonces optarg
se pone a cero. El siguiente ejemplo de código muestra cómo guardar el argumento señalado por la variable optarg
y luego operar sobre él según sea necesario. Tenga en cuenta que el argumento puede seguir a la opción sin un delimitador de espacio.
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int opt, xnum = 0;
char *pstr = NULL;
while ((opt = getopt(argc, argv, ":p:x")) != -1) {
printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);
switch (opt) {
case 'p':
pstr = optarg;
break;
case 'x':
xnum++;
break;
case ':':
fprintf(stderr,
"Missing argument!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
case '?':
fprintf(stderr,
"Unrecognized option!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
default:
fprintf(stderr, "Unexpected case in switch()");
exit(EXIT_FAILURE);
}
}
if (xnum != 0) printf("-x was specified (count=%d)\n", xnum);
if (pstr != NULL) printf("-p was specified with the value \"%s\"\n", pstr);
if (optind < argc)
printf("First non-option argument is \"%s\" at argv[%d]\n", argv[optind],
optind);
exit(EXIT_SUCCESS);
}
Comando de muestra:
./program_name -p hello
Producción :
opt = 112 (p); optind = 3
-p was specified with the value "hello"
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook