Use a função strdup em C

Jinku Hu 12 outubro 2023
  1. Use a função strdup para duplicar a string fornecida em C
  2. Use a função strndup para duplicar a string fornecida em C
  3. Use a função strdupa para duplicar a string fornecida em C
Use a função strdup em C

Este artigo irá explicar vários métodos de como usar a função strdup em C.

Use a função strdup para duplicar a string fornecida em C

strdup é uma das funções compatíveis com POSIX que está disponível na maioria dos sistemas operacionais baseados em UNIX. Ele implementa a funcionalidade de cópia de strings, mas faz a alocação e verificação de memória internamente. Embora um usuário seja responsável por liberar o ponteiro char retornado, já que o strdup aloca a memória com a chamada da função malloc.

strdup recebe um único argumento - a string de origem a ser duplicada e retorna o ponteiro para uma string recém-copiada. A função retorna NULL em caso de falha, ou seja, quando não há memória suficiente para alocar. Neste caso, estamos recuperando a variável de ambiente HOME usando a função getenv e copiando seu valor com 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);
}

Resultado:

/home/user

Use a função strndup para duplicar a string fornecida em C

strndup é uma função semelhante que recebe um argumento adicional para especificar o número de bytes que precisam ser copiados no máximo. Esta versão é útil para copiar apenas algumas partes da string. Observe, porém, que strndup adiciona o byte nulo de terminação aos caracteres copiados, garantindo assim que ele seja armazenado no formato de string no estilo C e possa ser manipulado 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);
}

Resultado:

/home

Use a função strdupa para duplicar a string fornecida em C

strdupa é parte da biblioteca GNU C e pode não estar disponível em outros compiladores C. strdupa é semelhante à função strdup exceto que usa alloca para alocação de memória. A função alloca implementa a alocação de memória na região da pilha, e a área é liberada automaticamente quando a função de chamada retorna. Portanto, o ponteiro retornado de strdupa não deve ser liberado explicitamente com a chamada free, pois isso resultará em uma falha de segmentação. Observe que a macro _GNU_SOURCE deve ser definida para compilar o código com sucesso.

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

Resultado:

/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

Artigo relacionado - C String