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.366 ]
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
Desenhando uma superfície Bézier
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (6)