La biblioteca getopt en C proporciona funciones para el análisis de argumentos de línea de comandos, facilitando el manejo de opciones en programas. Las tres funciones principales son:
getopt()
getopt_long()
getopt_long_only()
Variables globales esenciales:
optarg– puntero al parámetro de la opción actual, si existe.optind– índice del próximo argumento en argv para la siguiente llamada a getopt().optopt– carácter de la última opción no reconocida.
Función getopt()
Esta función analiza opciones de línea de comandos con formato corto.
Definición
int getopt(int num_args, char * const lista_args[], const char *cadena_opciones);
Parámetros:
num_args: cantidad de elementos en lista_args.lista_args: arreglo de cadenas que representa los argumentos, donde el primer elemento es el nombre del ejecutable.cadena_opciones: especifica las opciones válidas y sus requisitos de parámetros.
Ejemplo: al ejecutar ./programa -r 3000, num_args sería 3, con lista_args[0] = "./programa", lista_args[1] = "-r", lista_args[2] = "3000". Nota: el índice 0 no se analiza como opción.
Reglas de cadena_opciones
- Una letra seguida de dos puntos (
:) indica que la opción requiere un argumento. - Una letra seguida de dos puntos dobles (
::) especifica que el argumetno es opcional.
Valor de retorno
- Devuelve el carácter de la opción si se encuentra en lista_args.
- Retorna '?' para opciones desconocidas.
- Al finalizar el análisis, retorna -1.
- Si falta un argumento requerido, devuelve ':' si cadena_opciones inicia con ':', de lo contrario '?'.
Puntos importantes:
- Todas las opciones deben comenzar con un guion (
-), por ejemplo, -a o -b. - El análisis se detiene cuando se encuentran argumentos no opcionales.
Función getopt_long()
Similar a getopt(), pero admite opciones largas definidas mediante una estructura.
int getopt_long(int num_args, char * const lista_args[],
const char *cadena_opciones,
const struct definicion_opcion *opciones_largas, int *indice_largo);
Estructura definicion_opcion
struct definicion_opcion {
const char *nombre_largo; // Nombre de la opción larga (e.g., "ayuda")
int requiere_arg; // Valores: 0 (sin_argumento), 1 (argumento_requerido), 2 (argumento_opcional)
int *indicador; // Si es NULL, getopt_long() devuelve valor; si no, asigna valor a *indicador y retorna 0
int valor; // Valor asociado a la opción
};
Notas de uso:
- El arreglo de definiciones debe terminar con todos los campos en cero.
- Cuando requiere_arg es 1, el formato puede ser
--opcion valoro--opcion=valor. - Para requiere_arg igual a 2, solo se permite
--opcion=valor. - Las opciones largas admiten abreviaturas únicas, por ejemplo,
--aypara--ayuda.
Valor de retorno
- Para opciones cortas, retorna el carácter como en getopt().
- Para opciones largas, depende de los campos indicador y valor en la estructura.
- Retorna -1 al completar el análisis.
- Devuelve '?' para opciones ambiguas o no reconocidas.
Función getopt_long_only()
Idéntica a getopt_long(), pero permite omitir el prefijo -- en opciones largas, aceptando también -. Por ejemplo, -ayuda se trataría como --ayuda.