Análisis de Parámetros de Línea de Comandos con getopt

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 valor o --opcion=valor.
  • Para requiere_arg igual a 2, solo se permite --opcion=valor.
  • Las opciones largas admiten abreviaturas únicas, por ejemplo, --ay para --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.

Etiquetas: getopt getopt_long C argumentos_linea_comandos analisis_opciones

Publicado el 7-4 04:45