Um parser para tratar opções passadas para um programa em C

Publicado por Elder Marco (última atualização em 06/07/2010)

[ Hits: 6.336 ]

Homepage: http://www.eldermarco.com

Download getopt.c




Este programa utiliza a função getopt do arquivo de cabeçalho unistd.h para tratar opções simples passadas a um programa em C.  O uso de um parser costuma simplificar bastante a tarefa de tratar argumentos passados ao programa.  No exemplo abaixo eu considero três opções fictícias x,y e z que podem ser passadas para o programa, se que a opção -z requer algum argumento.

Eu falo com mais detalhes sobre essa função num post que escrevi no meu blog:

http://muitosmundos.wordpress.com/2010/05/13/tratando-argumentos-passados-a-um-programa-em-c/

  



Esconder código-fonte

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

int main ( int argc, char *argv[] )
{
   int opcao;      // Opção passada pelo usuário ao programa.
   int indice;      // Usado para pegar argumentos que não são opções
            // Nem argumentos usados em opções.

   int xflag =  0;      // Opção -x desativada por default
   int yflag =  0;      // Opção -y desativada por default

   char *zarg = NULL;   // Irá apontar para o argumento de z
                   // se for passado.

   // Desativa as mensagens de erro da função getopt
   opterr = 0;

   // Faz um loop pegando as opções passados pelo usuário. Note
   // o ':' depois do 'z'. Isso quer dizer que deve haver um
   // argumento depois dessa opção.
   while ( ( opcao = getopt ( argc, argv, "xyz:" ) ) != -1 )
   {
      switch ( opcao )
      {
         // Usuário passou a opção -x, habilita:
         case 'x':
            xflag = 1;
            break;

         // Usuário passou a opção -y, habilita:
         case 'y':
            yflag = 1;
            break;

         // Usuário escolheu a opção -z, pegar o argumento
         case 'z':
            zarg = optarg;
            break;

         // Se houve algum problema, vamos diagnosticar e enviar
         // nossas próprias mensagens de erro.
         case '?':
            if ( optopt == 'z' )   // Esqueceu um argumento
               fprintf (stderr, "Opção '-%c' requer argumento.\n",
               optopt);
            else if ( isprint ( optopt ) )
                    fprintf( stderr, "Opção '-%c' desconhecida.\n",
                    optopt );
                 else
                     fprintf( stderr, "Caractere '\\x%x' de opção desconhecido.\n",
                        optopt );
            exit ( 1 );
      }
   }

   printf ( "         xflag = %s\n", xflag ? "sim" : "não" );
   printf ( "         yflag = %s\n", yflag ? "sim" : "não" );
   printf ( "          zarg = %s\n", zarg  ?  zarg : "nenhum" );

   printf ( "Outros argumentos:\n" );

   for ( indice = optind; indice < argc; indice++ )
      printf ( "                 %s\n", argv[indice]);

   return 0;
}

Scripts recomendados

Métodos de Ordenação - Radix Sort

Ordenação Binaria

Desenhando uma curva Dragão ou o Fractal Jurassic Park

Controle de tráfego aéreo - filas dinâmicas

Aritmética de ponteiros


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts