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.768 ]
Homepage: http://www.eldermarco.com
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/
#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;
}
Controle de maior idade em C++
Loop de Várias Váriáveis Em Um Único Laço "For" em C
Nenhum comentário foi encontrado.
SynapSeq - programa para estimular as ondas cerebrais
Por que seu __DIR__ falhou ou o "inferno" dos caminhos no PHP
Preparando-se para certificações da LPI através do LPI Lab
Migração de Arch Linux para repositórios CachyOS (Uso de Instruções v3 e v4)
Arch Linux com repos do CachyOS para otimização ou usar Gentoo?
Ativando o modo Quake no XFCE4-Terminal
[Tutorial] Configurando Multimaster no Samba 4 AD (DC02) + Explicação de FSMO Roles
[Resolvido] Google Chrome reclamando de perfil em uso após mudar hostname
Como instalar Warsaw no Gentoo? (6)
Senhor Einstein tinha razão mesmo! [RESOLVIDO] (12)
Como insiro e excluo um elemento XML e JSON ao código Javascript (2)
Da pra formatar um netbook MGB e usar algum linux nele? É possível usa... (4)









