Posts Como utilizar a função getopt em C
Post
Cancel

Como utilizar a função getopt em C

Se você é um usuário de *nix, com certeza já teve que lidar com algum comando no terminal, boa parte desses comandos possuem argumentos que adicionam comportamentos para o comando. Por exemplo, o comando ls lista um diretório, se você usar ls -lah será listado diretórios, as permissões dos arquivos e os arquivos ocultos.

Em C, podemos usar a função getopt para adicionar argumentos nomeados para o software que estamos desenvolvendo.

Headers

Vamos começar importando os headers necessários. Em algumas documentações, é ensinado usar o header unistd.h para usar a função getopt, isso é errado, a função getopt possuí seu próprio header que é o getopt.h.

1
2
3
4
5
6
7
8
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

int
main(int argc, char *argv[]) {
    return EXIT_SUCCESS;
}

Inicialmente, vamos importar esses três headers. O primeiro, para usarmos funções de IO, o segundo, para usarmos a função exit() e o terceiro para as opções.

Dando continuidade ao desenvolvimento, vamos começar a definir nossa estrutura de dados contendo as opções que nosso programa aceita como argumento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <stdbool.h>

int
main(int argc, char *argv[]) {
    int next_option;
    const char *const short_options = "ho:v";

    const struct option long_options[] = {
        { "help",    0, NULL, 'h' },
        { "output",  1, NULL, 'o' },
        { "verbose", 0, NULL, 'v' },
        { NULL,      0, NULL,  0  },
    };

    const char *output_filename = NULL;
    bool verbose = false;
    program_name = argv[0];

    return EXIT_SUCCESS;
}

Definimos nossa estrutura long_options com os nomes das flags longas e um array de caracteres que define as flags curtas, isso deixa nosso programa mais flexível, aceitando os dois tipos de entrada. Note que somente o output aceita uma entrada de dados, as outras são flags booleanas.

Antes de avançarmos para o input do usuário, note a função print_usage no começo do arquivo, é uma função extremamente simples, recebe como argumento um stream de dados e um código de saída, depois, imprime um menu de ajuda para o usuário. Agora, precisamos ler as entradas que o usuário fez, para sabermos qual rotina executar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <stdbool.h>

const char *program_name;

void
print_usage(FILE *stream, int exit_code) {
    fprintf(stream, "Use: %s options\n", program_name);
    fprintf(stream,
            "-h --help      Mostra menu de ajuda\n"
            "-o --output    Escreve a saida no arquivo\n"
            "-v --verbose   Mostra mensagens detalhadas\n");

    exit(exit_code);
}

int
main(int argc, char *argv[]) {
    int next_option;
    const char *const short_options = "ho:v";

    const struct option long_options[] = {
        { "help",    0, NULL, 'h' },
        { "output",  1, NULL, 'o' },
        { "verbose", 0, NULL, 'v' },
        { NULL,      0, NULL,  0  },
    };

    const char *output_filename = NULL;
    bool verbose = false;
    program_name = argv[0];

    while((next_option = getopt_long(argc, argv, short_options, long_options, NULL)) > 0) {

        switch(next_option) {
            case 'h':
                print_usage(stdout, 0);
            case 'o':
                output_filename = optarg;
                break;
            case 'v':
                verbose = true;
                break;
            case '?':
                print_usage(stdout, 1);
            default:
                print_usage(stdout, 0);
        }
    }

    if (verbose) {
        printf("Output filename: %s\n", output_filename);
    }

    return EXIT_SUCCESS;
}

Compile o código com o GCC

1
gcc  getopt.c -o getopt

Agora, valide se todas as flags estão funcionando.

1
2
3
./getopt -h
./getopt -o saida.log -v
./getopt --output saida.log -v
This post is licensed under CC BY 4.0 by the author.
Trending Tags
Contents

Trending Tags