Como a variável optind é atribuída em C

Jinku Hu 12 outubro 2023
  1. Use a função getopt para analisar opções de linha de comando em C
  2. Use as variáveis ​​optind e caracterg para processar os elementos argv em C
Como a variável optind é atribuída 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"
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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