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.605 ]
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++
Desenhando Nuvens ou o Fractal de Plasma
Nenhum comentário foi encontrado.
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
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
O programa assinador digital (0)
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)
Instalação não está resolvendo as dependencias (2)
Captação de áudio no zorin linux começa a diminuir com o tempo (5)









