Utilisez la fonction strdup en C

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction strdup pour dupliquer la chaîne donnée en C
  2. Utilisez la fonction strndup pour dupliquer la chaîne donnée en C
  3. Utilisez la fonction strdupa pour dupliquer la chaîne donnée en C
Utilisez la fonction strdup en C

Cet article explique plusieurs méthodes d’utilisation de la fonction strdup en C.

Utilisez la fonction strdup pour dupliquer la chaîne donnée en C

strdup est l’une des fonctions compatibles POSIX disponibles sur la plupart des systèmes d’exploitation UNIX. Il implémente la fonctionnalité de copie de chaînes mais fait l’allocation de mémoire et la vérification en interne. Bien qu’un utilisateur soit responsable de la libération du pointeur char retourné, car strdup alloue la mémoire avec l’appel de fonction malloc.

strdup prend un seul argument - la chaîne source à dupliquer et renvoie le pointeur vers une chaîne nouvellement copiée. La fonction renvoie NULL en cas d’échec, c’est-à-dire lorsqu’il n’y a pas suffisamment de mémoire à allouer. Dans ce cas, nous récupérons la variable d’environnement HOME en utilisant la fonction getenv et copions sa valeur avec 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);
}

Production:

/home/user

Utilisez la fonction strndup pour dupliquer la chaîne donnée en C

strndup est une fonction similaire qui prend un argument supplémentaire pour spécifier le nombre d’octets qui doivent être copiés au maximum. Cette version est utile pour copier uniquement certaines parties de la chaîne. Notez cependant que strndup ajoute l’octet nul de fin aux caractères copiés, garantissant ainsi qu’il est stocké au format de chaîne de style C et peut être manipulé en tant que tel.

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

Production:

/home

Utilisez la fonction strdupa pour dupliquer la chaîne donnée en C

strdupa fait partie de la bibliothèque GNU C et peut ne pas être disponible dans d’autres compilateurs C. strdupa est similaire à la fonction strdup sauf qu’elle utilise alloca pour l’allocation de mémoire. La fonction alloca implémente l’allocation de mémoire sur la région de la pile, et la zone est libérée automatiquement lorsque la fonction appelante revient. Ainsi, le pointeur renvoyé par strdupa ne doit pas être libéré explicitement avec l’appel free car cela entraînera une erreur de segmentation. Notez que la macro _GNU_SOURCE doit être définie pour compiler le code avec succès.

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

Production:

/home/user
Auteur: 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

Article connexe - C String