Utilice la función strdup en C

Jinku Hu 12 octubre 2023
  1. Utilice la función strdup para duplicar la cadena dada en C
  2. Utilice la función strndup para duplicar la cadena dada en C
  3. Utilice la función strdupa para duplicar la cadena dada en C
Utilice la función strdup en C

Este artículo explicará varios métodos de cómo utilizar la función strdup en C.

Utilice la función strdup para duplicar la cadena dada en C

strdup es una de las funciones compatibles con POSIX que está disponible en la mayoría de los sistemas operativos basados en UNIX. Implementa la funcionalidad de copia de cadenas, pero realiza la asignación de memoria y la verificación internamente. Aunque un usuario es responsable de liberar el puntero char devuelto ya que el strdup asigna la memoria con la llamada a la función malloc.

strdup toma un único argumento: la cadena de origen que se va a duplicar y devuelve el puntero a una cadena recién copiada. La función devuelve NULL en caso de error, es decir, cuando no hay suficiente memoria para asignar. En este caso, estamos recuperando la variable de entorno HOME usando la función getenv y copiando su valor 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);
}

Producción :

/home/user

Utilice la función strndup para duplicar la cadena dada en C

strndup es una función similar que toma un argumento adicional para especificar el número de bytes que deben copiarse como máximo. Esta versión es útil para copiar solo ciertas partes de la cadena. Sin embargo, tenga en cuenta que strndup agrega un byte nulo de terminación a los caracteres copiados, lo que garantiza que se almacene como formato de cadena de estilo C y pueda manipularse como tal.

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

Producción :

/home

Utilice la función strdupa para duplicar la cadena dada en C

strdupa es parte de la biblioteca GNU C y puede no estar disponible en otros compiladores C. strdupa es similar a la función strdup excepto que usa alloca para la asignación de memoria. La función alloca implementa la asignación de memoria en la región de la pila, y el área se libera automáticamente cuando regresa la función de llamada. Por lo tanto, el puntero devuelto por strdupa no debe liberarse explícitamente con la llamada free ya que resultará en un error de segmentación. Tenga en cuenta que la macro _GNU_SOURCE debe definirse para compilar el código correctamente.

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

Producción :

/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

Artículo relacionado - C String