argc und argv in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Notation int argc, char *argv[], um Befehlszeilenargumente in C zu erhalten
  2. Verwenden von memccpy zum Verketten von Befehlszeilenargumenten in C
argc und argv in C

In diesem Artikel werden mehrere Methoden zur Verwendung von Kommandozeilenargumenten, argc und argv, in C erklärt.

Verwenden Sie die Notation int argc, char *argv[], um Befehlszeilenargumente in C zu erhalten

Wenn ein Programm ausgeführt wird, kann der Benutzer durch Leerzeichen getrennte Zeichenketten angeben, die Befehlszeilenargumente genannt werden. Diese Argumente werden in der Funktion main des Programms zur Verfügung gestellt und können als einzelne null-terminierte Zeichenketten geparst werden. Um auf die Argumente zuzugreifen, sollten wir Parameter wie int argc, char *argv[] angeben, die die Anzahl der übergebenen Argumente und das Array der Zeichenketten mit den Befehlszeilenargumenten darstellen. Die erste Zeichenkette im Array ist gemäß der Konvention der Programmname selbst; die Anzahl der Argumente argc enthält also den Programmnamen. Wir können jedes Befehlszeilenargument mit einer einfachen Iteration durch das Array argv ausgeben, wie im folgenden Beispiel gezeigt.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  for (int i = 0; i < argc; i++) printf("argv[%d] = %s\n", i, argv[i]);

  exit(EXIT_SUCCESS);
}

Beispiel-Befehl:

./program hello there

Ausgabe:

argv[0] = ./program
argv[1] = hello
argv[2] = there

Das argv-Array mit null-terminierten Zeichenketten wird mit einem NULL-Zeiger abgeschlossen, um das letzte Argument zu kennzeichnen. So können wir diese Eigenschaft nutzen, um die Argumentdruckschleife zu implementieren, indem wir den argv-Zeiger selbst auswerten und ihn inkrementieren, bis er gleich NULL ist. Beachten Sie, dass es besser ist, einen separaten char*-Zeiger für die Schleife zu erstellen, um die ursprüngliche Adresse des Arrays zu erhalten, falls sie später im Programm benötigt wird. Der folgende Beispielcode geht davon aus, dass derselbe Befehl wie im vorherigen Beispiel ausgeführt wird.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  char **ptr;
  for (ptr = argv; *ptr != NULL; ptr++) printf("%s\n", *ptr);

  exit(EXIT_SUCCESS);
}

Ausgabe:

./program
hello
there

Verwenden von memccpy zum Verketten von Befehlszeilenargumenten in C

Die Funktion memccpy gehört zu den String-Utilities der Standardbibliothek, die zum Verketten der Array-Strings argv verwendet werden. Beachten Sie, dass memccpy ähnlich wie memcpy ist, außer dass es das vierte Argument benötigt, um das Zeichen anzugeben, bei dem das Kopieren beendet werden soll. Wir nutzen die letztere Eigenschaft aus, um nur den Inhalt der Zeichenkette zu kopieren und bei einem abschließenden Null-Byte zu stoppen. Im folgenden Beispiel prüfen wir, ob der Benutzer genau zwei Argumente (außer dem Programmnamen) angegeben hat und setzen erst dann die Programmausführung fort. Folglich verketten wir zwei memccpy-Aufrufe, um beide Argumente zu kopieren und die konkatenierte Zeichenkette in die stdout auszugeben.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  if (argc != 3) {
    printf("Usage: ./program string1 string2\n");
    exit(EXIT_FAILURE);
  }

  size_t size = strlen(argv[1]) + strlen(argv[2]);
  char buf[size];

  memccpy(memccpy(buf, argv[1], '\0', size) - 1, argv[2], '\0', size);
  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

Ausgabe:

hellothere
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

Verwandter Artikel - C Process