Cómo se asigna la variable optind en C

Jinku Hu 12 octubre 2023
  1. Utilice la función getopt para analizar las opciones de la línea de comandos en C
  2. Utilice las variables optind y optarg para procesar elementos argv en C
Cómo se asigna la variable optind 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"
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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