Como a variável optind é atribuída em C
-
Use a função
getoptpara analisar opções de linha de comando em C -
Use as variáveis
optindecaractergpara processar os elementosargvem 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