Manejar argumentos usando getopt en C++

Muhammad Husnain 12 octubre 2023
Manejar argumentos usando getopt en C++

Este artículo demuestra cómo usar la función getopt() para manejar los argumentos pasados ​​en la línea de comando al código. El tutorial también explica cómo se puede manipular el código para realizar ciertas acciones con una entrada específica.

Manejar argumentos usando la función getopt() en C++

Supongamos que tenemos el código que se muestra a continuación.

// File titled arg_test.cpp
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  int opt;

  while ((opt = getopt(argc, argv, ":f:asd")) != -1) {
    if (opt == 'a' || opt == 's' || opt == 'd') {
      printf("Option Selected is: %c\n", opt);
    } else if (opt == 'f') {
      printf("Filename entered is: %s\n", optarg);
    } else if (opt == ':') {
      printf("Option requires a value \n");
    } else if (opt == '?') {
      printf("Unknown option: %c\n", optopt);
    }
  }

  // optind is for the extra arguments that are not parsed by the program
  for (; optind < argc; optind++) {
    printf("Extra arguments, not parsed: %s\n", argv[optind]);
  }

  return 0;
}

La sintaxis de la función getopt() es la siguiente:

getopt(int argc, char *const argv[], const char *optstring)

El argc es un número entero, y argv es un array de caracteres. La cadena de opciones es una lista de caracteres, cada uno de los cuales representa una opción de un solo carácter de largo.

La función devuelve -1 cuando termina de procesar todo en la entrada.

La función getopt() devuelve ? cuando encuentra algo que no reconoce. Además, esta opción no reconocida se almacena en la variable externa optopt.

De forma predeterminada, si la opción requiere un valor, por ejemplo, en nuestro caso, la opción f requiere un valor de entrada, por lo que getopt() devolverá ?. Sin embargo, al colocar los dos puntos (:) como el primer carácter de optstring, la función devuelve : en lugar de ?.

En nuestro caso, ingresar una entrada de a, s o d debería devolver la opción en sí, usar f debería devolver el nombre de archivo proporcionado como argumento, y todo lo demás no debería considerarse una opción válida.

Para ejecutar el código anterior, puede utilizar un comando similar en su terminal:

gcc arg_test.cpp && ./a.out

Por supuesto, solo ingresar esto no le dará ningún resultado útil. Ingresaremos un caso de uso de ejemplo y una salida de muestra y explicaremos cómo se procesa cada comando.

Si ingresamos el siguiente comando como ejemplo:

gcc arg_test.cpp && ./a.out -f filename.txt -i -y -a -d testingstring not_an_option

Obtendremos lo siguiente como salida:

Filename entered is: filename.txt
Unknown option: i
Unknown option: y
Option Selected is: a
Option Selected is: d
Extra arguments, not parsed: testingstring
Extra arguments, not parsed: not_an_option

Las opciones a y d se devolvieron como se esperaba. También se informa el nombre de archivo dado después de la bandera f, y las opciones i e y entraron en el ? categoría y fueron reconocidos como comandos desconocidos.

Aquí, podemos ver que además de los escenarios descritos anteriormente, el último ciclo que agregamos después de la función getopt() procesa los argumentos restantes que no fueron procesados ​​por la función (testingstring y not_an_option, en nuestro caso).

Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn

Artículo relacionado - C++ Function