Usa la funzione strdup in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione strdup per duplicare la stringa data in C
  2. Usa la funzione strndup per duplicare la stringa data in C
  3. Usa la funzione strdupa per duplicare la stringa data in C
Usa la funzione strdup in C

Questo articolo spiegherà diversi metodi su come utilizzare la funzione strdup in C.

Usa la funzione strdup per duplicare la stringa data in C

strdup è una delle funzioni compatibili con POSIX disponibile sulla maggior parte dei sistemi operativi basati su UNIX. Implementa la funzionalità di copia delle stringhe ma esegue l’allocazione e il controllo della memoria internamente. Sebbene un utente sia responsabile della liberazione del puntatore restituito a char poiché strdup alloca la memoria con la chiamata alla funzione malloc.

strdup accetta un singolo argomento: la stringa sorgente da duplicare e restituisce il puntatore a una stringa appena copiata. La funzione restituisce NULL in caso di errore, ovvero quando c’è una memoria insufficiente da allocare. In questo caso, stiamo recuperando la variabile d’ambiente HOME usando la funzione getenv e copiando il suo valore con 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);
}

Produzione:

/home/user

Usa la funzione strndup per duplicare la stringa data in C

strndup è una funzione simile che richiede un argomento aggiuntivo per specificare il numero di byte che devono essere copiati al massimo. Questa versione è utile per copiare solo alcune parti della stringa. Nota però, strndup aggiunge un byte nullo di terminazione ai caratteri copiati, assicurando così che sia memorizzato come formato stringa in stile C e possa essere manipolato come tale.

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

Produzione:

/home

Usa la funzione strdupa per duplicare la stringa data in C

strdupa fa parte della libreria GNU C e potrebbe non essere disponibile in altri compilatori C. strdupa è simile alla funzione strdup tranne per il fatto che usa alloca per l’allocazione della memoria. La funzione alloca implementa l’allocazione della memoria nella regione dello stack e l’area viene liberata automaticamente quando ritorna la funzione chiamante. Pertanto, il puntatore restituito da strdupa non dovrebbe essere liberato esplicitamente con la chiamata a free poiché risulterà in un errore di segmentazione. Nota che la macro _GNU_SOURCE dovrebbe essere definita per compilare il codice con successo.

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

Produzione:

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

Articolo correlato - C String