Como a variável optind é atribuída em C
-
Use a função
getopt
para analisar opções de linha de comando em C -
Use as variáveis
optind
ecaracterg
para processar os elementosargv
em C
Este artigo demonstrará vários métodos sobre como a variável optind
é atribuída em C.
Use a função getopt
para analisar opções de linha de comando em C
Programas de linha de comando típicos em sistemas baseados em UNIX usam argumentos e opções. As opções são geralmente especificadas com caracteres que seguem hifens, e cada caractere único indica informações sobre o argumento fornecido ou produz o comportamento específico do programa a ser executado. As opções podem ter argumentos obrigatórios ou opcionais; no último caso, é comum que os programas permitam o agrupamento das opções após um único hífen e o único argumento pode ser passado no final do comando.
A função getopt
é usada para analisar as opções e recuperar os argumentos fornecidos do programa e executar os caminhos de código correspondentes com base na entrada. getopt
leva três argumentos, os dois primeiros dos quais são argc
e argv
passados para a função main
. O terceiro argumento é optstring
- um ponteiro para uma cadeia de caracteres que representa os caracteres de opção legítimos. getopt
deve ser chamado sucessivamente até que todas as opções sejam recuperadas.
No exemplo a seguir, demonstramos um programa que aceita opções com os caracteres p
e x
. Observe que optstring
começa com dois pontos que indica o valor que precisa ser retornado pela chamada getopt
quando os argumentos ausentes são encontrados. Além disso, dois pontos especificados após um caractere (por exemplo, p
) indica que o argumento é necessário para a opção; dois dois pontos significa que o argumento é opcional. O mesmo caractere de opção pode ser passado várias vezes na linha de comando. A função getopt
retorna o caractere de opção se for bem-sucedido ou retorna o caractere ?
se o caractere de opção encontrado não estiver em optstring
.
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int opt, xnum = 0;
char *pstr = NULL;
while ((opt = getopt(argc, argv, ":p:x")) != -1) {
printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);
switch (opt) {
case 'p':
pstr = optarg;
break;
case 'x':
xnum++;
break;
case ':':
fprintf(stderr,
"Missing argument!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
case '?':
fprintf(stderr,
"Unrecognized option!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
default:
fprintf(stderr, "Unexpected case in switch()");
exit(EXIT_FAILURE);
}
}
exit(EXIT_SUCCESS);
}
Comando de amostra:
./program_name -p hello -p there
Resultado:
opt = 112 (p); optind = 3
opt = 112 (p); optind = 5
Use as variáveis optind
e caracterg
para processar os elementos argv
em C
O exemplo de código anterior demonstra o uso típico de getopt
, em que a função é chamada a partir de uma expressão de loop while
até retornar o código de erro -1
. Enquanto isso, a instrução switch
verifica os possíveis valores de retorno getopt
para executar os blocos de código correspondentes. Observe que a variável optind
representa o índice do próximo elemento no argv
e é inicializado como 1
antes da primeira chamada para getopt
. Por outro lado, optarg
é uma variável externa que aponta para o argumento a seguir ao caractere da opção atual. Se a opção não incluir um argumento, apresentarg
será zerado. O próximo exemplo de código mostra como salvar o argumento apontado pela variável optarg
e operá-lo conforme necessário. Lembre-se de que o argumento pode seguir a opção sem um delimitador de espaço.
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int opt, xnum = 0;
char *pstr = NULL;
while ((opt = getopt(argc, argv, ":p:x")) != -1) {
printf("opt = %3d (%c); optind = %d\n", opt, opt, optind);
switch (opt) {
case 'p':
pstr = optarg;
break;
case 'x':
xnum++;
break;
case ':':
fprintf(stderr,
"Missing argument!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
case '?':
fprintf(stderr,
"Unrecognized option!\n"
"Usage: %s [-p arg] [-x]\n",
argv[0]);
exit(EXIT_FAILURE);
default:
fprintf(stderr, "Unexpected case in switch()");
exit(EXIT_FAILURE);
}
}
if (xnum != 0) printf("-x was specified (count=%d)\n", xnum);
if (pstr != NULL) printf("-p was specified with the value \"%s\"\n", pstr);
if (optind < argc)
printf("First non-option argument is \"%s\" at argv[%d]\n", argv[optind],
optind);
exit(EXIT_SUCCESS);
}
Comando de amostra:
./program_name -p hello
Resultado:
opt = 112 (p); optind = 3
-p was specified with the value "hello"
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook