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.615 ]
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;
}
Desenhando uma curva Dragão ou o Fractal Jurassic Park
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (7)
O programa assinador digital (5)









