Wie optind Variable in C zugewiesen wird

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion getopt, um Befehlszeilenoptionen in C zu analysieren
  2. Verwenden Sie die Variablen optind und optarg, um die Elemente argv in C zu verarbeiten
Wie optind Variable in C zugewiesen wird

Dieser Artikel zeigt verschiedene Methoden, wie die Variable optind in C zugewiesen wird.

Verwenden Sie die Funktion getopt, um Befehlszeilenoptionen in C zu analysieren

Typische Befehlszeilenprogramme auf UNIX-basierten Systemen verwenden Argumente und Optionen. Optionen werden normalerweise mit Zeichen angegeben, die auf Bindestriche folgen, und jedes eindeutige Zeichen gibt entweder Informationen zu dem angegebenen Argument an oder liefert das spezifische Verhalten des auszuführenden Programms. Optionen können obligatorische oder optionale Argumente haben. Im letzteren Fall ist es für Programme üblich, die Gruppierung der Optionen nach einem einzelnen Bindestrich zuzulassen, und das einzige Argument kann am Ende des Befehls übergeben werden.

Die Funktion getopt wird verwendet, um die Optionen zu analysieren, gegebene Argumente aus dem Programm abzurufen und die entsprechenden Codepfade basierend auf der Eingabe auszuführen. getopt verwendet drei Argumente, von denen die ersten beiden argc und argv sind, die an die Funktion main übergeben werden. Das dritte Argument ist optstring - ein Zeiger auf eine Zeichenkette, die die legitimen Optionszeichen darstellt. getopt muss nacheinander aufgerufen werden, bis alle Optionen abgerufen wurden.

Im folgenden Beispiel zeigen wir ein Programm, das Optionen mit den Zeichen p und x verwendet. Beachten Sie, dass optstring mit dem Doppelpunkt beginnt, der den Wert angibt, der vom Aufruf getopt zurückgegeben werden muss, wenn die fehlenden Argumente auftreten. Ein nach einem Zeichen angegebener Doppelpunkt (z. B. p) gibt außerdem an, dass das Argument für die Option erforderlich ist. Zwei Doppelpunkte bedeuten, dass das Argument optional ist. Das gleiche Optionszeichen kann in der Befehlszeile mehrmals übergeben werden. Die Funktion getopt gibt bei Erfolg das Optionszeichen zurück oder gibt das Zeichen ? Zurück. wenn sich das angetroffene Optionszeichen nicht in optstring befindet.

#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);
}

Beispielbefehl:

./program_name -p hello -p there

Ausgabe:

opt = 112 (p); optind = 3
opt = 112 (p); optind = 5

Verwenden Sie die Variablen optind und optarg, um die Elemente argv in C zu verarbeiten

Das vorherige Codebeispiel zeigt die typische Verwendung von getopt, bei der die Funktion von einem Ausdruck der while-Schleife aufgerufen wird, bis der Fehlercode -1 zurückgegeben wird. In der Zwischenzeit sucht die Anweisung switch nach möglichen getopt-Rückgabewerten, um die entsprechenden Codeblöcke auszuführen. Beachten Sie, dass die Variable optind den Index des nächsten Elements im argv darstellt und vor dem ersten Aufruf von getopt auf 1 initialisiert wird. Andererseits ist optarg eine externe Variable, die auf das Argument verweist, das auf das aktuelle Optionszeichen folgt. Wenn die Option kein Argument enthält, wird optarg auf Null gesetzt. Das nächste Codebeispiel zeigt, wie Sie das Argument speichern, auf das die Variable optarg zeigt, und es dann nach Bedarf bearbeiten. Beachten Sie, dass das Argument der Option ohne Leerzeichen folgen kann.

#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);
}

Beispielbefehl:

./program_name -p hello

Ausgabe:

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