argc und argv in C
-
Verwenden Sie die Notation
int argc, char *argv[]
, um Befehlszeilenargumente in C zu erhalten -
Verwenden von
memccpy
zum Verketten von Befehlszeilenargumenten 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
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