subrutina getopt

Finalidad

Devuelve la siguiente letra de distintivo especificada en la línea de mandatos.

Biblioteca

Biblioteca C estándar (libc.a)

Sintaxis

#include <unistd.h>
int getopt (ArgumentC,  ArgumentV,  OptionString)
int ArgumentC;
char *const ArgumentV [ ];
const char *OptionString;
extern int  optind;
extern int  optopt;
extern int  opterr;
extern char * optarg;

Descripción

El parámetro optind indexa el siguiente elemento del parámetro ArgumentV que se va a procesar. Se inicializa en 1 y la subrutina getopt lo actualiza después de llamar a cada elemento del parámetro ArgumentV .

La subrutina getopt devuelve la siguiente letra de distintivo en la lista de parámetros ArgumentV que coincide con una letra en el parámetro OptionString . Si el distintivo toma un argumento, la subrutina getopt establece el parámetro optarg para que apunte al argumento como se indica a continuación:

  • Si el distintivo era la última letra de la serie a la que apuntaba un elemento del parámetro ArgumentV , el parámetro optarg contiene el siguiente elemento del parámetro ArgumentV y el parámetro optind se incrementa en 2. Si el valor resultante del parámetro optind no es menor que el parámetro ArgumentC , esto indica que falta un argumento de distintivo y la subrutina getopt devuelve un mensaje de error.
  • De lo contrario, el parámetro optarg apunta a la serie que sigue a la letra de distintivo en ese elemento del parámetro ArgumentV y el parámetro optind se incrementa en 1.
Nota: El usuario que desea explorar el mismo parámetro ArgumentV de nuevo o explorar varios conjuntos ArgumentV en el mismo programa, debe reinicializar la subrutina getopt () estableciendo el parámetro optind en 0.

Parámetros

Elemento Descripción
ArgumentC Especifica el número de parámetros pasados a la rutina.
ArgumentV Especifica la lista de parámetros pasados a la rutina.
OptionString Especifica una serie de letras de distintivo reconocidas. Si una letra va seguida de un signo: (dos puntos), se espera que el distintivo tome un parámetro que puede o no estar separado del mismo por un espacio en blanco.
OPTIND Especifica el siguiente elemento de la matriz ArgumentV que se va a procesar.
optopt Especifica cualquier carácter erróneo en el parámetro OptionString .
opterr Indica que se ha producido un error cuando se ha establecido en un valor distinto de 0.
OPTARG Apunta al siguiente argumento de distintivo de opción.

Valores de retorno

La subrutina getopt devuelve la siguiente letra de distintivo especificada en la línea de mandatos. Se devuelve un valor de -1 cuando se han analizado todas las banderas de línea de comandos. Cuando el valor del parámetro ' ArgumentV  '[ 'optind '] es nulo, ' * 'ArgumentoV ' [ 'optind '] no es el carácter ' (menos), o ' ArgumentV  '[ 'optind '] apunta a la cadena "-" (menos), la subrutina ' getopt ' devuelve un valor de ' -1 sin cambiar el valor. Si ArgumentV [optind] apunta a la cadena"- -" (doble menos), la subrutina getopt devuelve un valor de -1 después de incrementar el valor del parámetro optind.

Códigos de error

Si la subrutina getopt encuentra un carácter de opción que no está especificado por el parámetro OptionString , un ? Se devuelve el carácter (signo de interrogación). Si detecta que falta un argumento de opción y el primer carácter de OptionString es un : (dos puntos), se devuelve un carácter : (dos puntos). Si esta subrutina detecta que falta un argumento de opción y el primer carácter de OptionString no es un signo de dos puntos, devuelve un ? (signo de interrogación). En cualquier caso, la subrutina getopt establece el parámetro optopt en el carácter de opción que ha causado el error. Si la aplicación no ha establecido el parámetro opterr en 0 y el primer carácter de OptionString no es un : (dos puntos), la subrutina getopt también imprime un mensaje de diagnóstico en el error estándar.

Ejemplos

El fragmento de código siguiente procesa los distintivos para un mandato que puede tomar los distintivos mutuamente excluyentes a y b, y los distintivos f y o, ambos de los cuales requieren parámetros.

#include <unistd.h>    /*Needed for access subroutine constants*/
main (argc, argv)
int argc;
char **argv;
{
   int c;
   extern int optind;
   extern char *optarg;
   .
   .
   .
   while ((c = getopt(argc, argv, "abf:o:")) != EOF)
   {
      switch (c)
      {
         case 'a':
            if (bflg)
               errflg++;
            else
               aflg++;
            break;
         case 'b':
            if (aflg)
               errflg++;
            else
               bflg++;
            break;
         case 'f':
            ifile = optarg;
            break;
         case 'o':
            ofile = optarg;
            break;
         case '?':
            errflg++;
      } /* case */
      if (errflg)
      {
         fprintf(stderr, "usage: . . . ");
         exit(2);
      }
   } /* while */
   for ( ; optind < argc; optind++)
   {
      if (access(argv[optind], R_OK))
      {
         .
         .
         .
      }
   } /* for */
}   /* main */