Francisco Valladolid
Published

Fri 12 March 2021

←Home

getopt in C

Funcion getopt en C - Linux/BSD y variantes unicamente.

Definición.

getopt() es una función escrita en lenguaje C para analizar argumentos en la linea de comandos.

Sintaxis.

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

  Donde optstring es una lista de caracteres, 
  cada uno representando una opción.

Valores de retorno.

La funcion getopt() regresa diferentes valores.

  • Si la opcion toma un valor en la linea de comandos, el valor es un puntero a la variable externa optarg

  • '-1' Si no hay mas argumentos.

  • '?' Valor no reconocido y almacenado en la variable optopt
  • if una opcion requiere un valor (-f archivo.txt) y no existe tal, entonces getopt() regresa un '?'

  • Si colocamos ':' como primer caracter en la lista de argumentos optstring getopt() regresa ':' en lugar de '?' cuando no hay ningun valor.

Normalmente getopt() es llamada dentro de un ciclo condicional, el ciclo termina cuando la función regresa -1

switch() es usada entonces con el valor regresado por la funcion getopt() y evalua las opciones dadas.

un segundo ciclo es usado para procesar los argumentos extra que no pudieron ser procesados en el primer ciclo.

A continuación, el siguiente ejemplo escrito en C ilustra la función correctamente.

Ejemplo:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    int opt;
    while((opt=getopt(argc, argv, ":if:lxr")) != -1)
    {
        switch(opt)
        {
            case 'i':
            case 'l':
            case 'r':
                printf("opcion: %c\n", opt);
                break;
            case 'f':
                printf("nombre del archivo: %s\n", optarg);
                break;
            case ':':
                printf("Se necesita un valor\n");
                break;
            case '?':
                printf("Opcion Desconocida: %c\n", optopt);
                break;
        }
    }
    for(; optind < argc; optind++){
        printf("argumentos extra: %s\n", argv[optind]);
    }

    return 0;
}

La función getopt() esta disponible solamente en sistemas compatibles con el estandar posix.

Referencias:

getopt(3) NetBSD

getopt(3) OpenBSD

getopt(3) FreeBSD

getopt(3) Linux

Go Top
comments powered by Disqus