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.718 ]
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;
}
Lista simplesmente encadeada com busca auto-organizada
Nenhum comentário foi encontrado.
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Gentoo binário em 2026: UEFI, LUKS, Btrfs e Systemd
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Vou destruir sua infância:) (6)
Quando vocês pararam de testar distros? (24)
O que houve com slackware ??? (12)









