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.208 ]
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; }
Nenhum comentário foi encontrado.
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
E a guerra contra bots continua
Tradução do artigo do filósofo Gottfried Wilhelm Leibniz sobre o sistema binário
Conheça o firewall OpenGFW, uma implementação do (Great Firewall of China).
Instalando o FreeOffice no LMDE 6
Anki: Remover Tags de Estilo HTML de Todas as Cartas
Colocando uma opção de redimensionamento de imagem no menu de contexto do KDE
Não consigo acessar os modos de desempenho (6)
Debian Bookworm para a versão beta Debian 13 Trixie (4)
Reinstalei o Debian 12 e a particao /home foi formatada: recuperando s... (0)
[Shell Script] Script para desinstalar pacotes desnecessários no OpenSuse
[Shell Script] Script para criar certificados de forma automatizada no OpenVpn
[Shell Script] Conversor de vídeo com opção de legenda
[C/C++] BRT - Bulk Renaming Tool
[Shell Script] Criação de Usuarios , Grupo e instalação do servidor de arquivos samba