Verwendung der Funktion strdup in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion strdup, um die gegebene Zeichenkette in C zu duplizieren
  2. Verwenden der Funktion strndup zum Duplizieren der gegebenen Zeichenkette in C
  3. Verwenden Sie die Funktion strdupa, um die gegebene Zeichenkette in C zu duplizieren
Verwendung der Funktion strdup in C

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
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 String