Verwendung der Funktion strdup in C
-
Verwenden Sie die Funktion
strdup
, um die gegebene Zeichenkette in C zu duplizieren -
Verwenden der Funktion
strndup
zum Duplizieren der gegebenen Zeichenkette in C -
Verwenden Sie die Funktion
strdupa
, um die gegebene Zeichenkette in C zu duplizieren
In diesem Artikel werden mehrere Methoden zur Verwendung der Funktion strdup
in C erläutert.
Verwenden Sie die Funktion strdup
, um die gegebene Zeichenkette in C zu duplizieren
strdup
ist eine der POSIX-kompatiblen Funktionen, die auf den meisten UNIX-basierten Betriebssystemen verfügbar ist. Sie implementiert die String-Kopierfunktionalität, führt aber die Speicherzuweisung und -prüfung intern durch. Obwohl ein Benutzer für das Freigeben des zurückgegebenen char
-Zeigers verantwortlich ist, da strdup
den Speicher mit dem Funktionsaufruf malloc
alloziert.
Die Funktion strdup
benötigt ein einziges Argument - die zu duplizierende Quellzeichenkette - und gibt den Zeiger auf eine neu kopierte Zeichenkette zurück. Die Funktion gibt im Fehlerfall NULL
zurück, nämlich dann, wenn nicht genügend Speicher für die Allokation vorhanden ist. In diesem Fall holen wir uns die Umgebungsvariable HOME
mit der Funktion getenv
und kopieren ihren Wert mit strdup
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *path = NULL;
const char *temp = getenv("HOME");
if (temp != NULL) {
path = strdup(temp);
if (path == NULL) {
perror("strdup");
exit(EXIT_FAILURE);
}
} else {
fprintf(stderr, "$HOME environment variable is not defined\n");
exit(EXIT_FAILURE);
}
printf("%s\n", path);
free(path);
exit(EXIT_SUCCESS);
}
Ausgabe:
/home/user
Verwenden der Funktion strndup
zum Duplizieren der gegebenen Zeichenkette in C
strndup
ist eine ähnliche Funktion, die ein zusätzliches Argument benötigt, um die Anzahl der Bytes anzugeben, die maximal kopiert werden sollen. Diese Version ist nützlich, um nur bestimmte Teile der Zeichenkette zu kopieren. Beachten Sie jedoch, dass strndup
den kopierten Zeichen ein abschließendes Null-Byte hinzufügt, wodurch sichergestellt wird, dass die Zeichenkette im C-Stil gespeichert wird und als solche manipuliert werden kann.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *path = NULL;
const char *temp = getenv("HOME");
if (temp != NULL) {
path = strndup(temp, 5);
if (path == NULL) {
perror("strdup");
exit(EXIT_FAILURE);
}
} else {
fprintf(stderr, "$HOME environment variable is not defined\n");
exit(EXIT_FAILURE);
}
printf("%s\n", path);
free(path);
exit(EXIT_SUCCESS);
}
Ausgabe:
/home
Verwenden Sie die Funktion strdupa
, um die gegebene Zeichenkette in C zu duplizieren
strdupa
ist Teil der GNU C-Bibliothek und ist möglicherweise in anderen C-Compilern nicht verfügbar. Die Funktion strdupa
ähnelt der Funktion strdup
mit dem Unterschied, dass sie alloca
für die Speicherzuweisung verwendet. Die Funktion alloca
implementiert die Speicherzuweisung auf dem Stack-Bereich, und der Bereich wird automatisch freigegeben, wenn die aufrufende Funktion zurückkehrt. Daher sollte der von strdupa
zurückgegebene Zeiger nicht explizit mit dem free
-Aufruf freigegeben werden, da dies zu einem Segmentierungsfehler führen würde. Beachten Sie, dass das Makro _GNU_SOURCE
definiert sein sollte, um den Code erfolgreich zu kompilieren.
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *path = NULL;
const char *temp = getenv("HOME");
if (temp != NULL) {
path = strdupa(temp);
if (path == NULL) {
perror("strdup");
exit(EXIT_FAILURE);
}
} else {
fprintf(stderr, "$HOME environment variable is not defined\n");
exit(EXIT_FAILURE);
}
printf("%s\n", path);
exit(EXIT_SUCCESS);
}
Ausgabe:
/home/user
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