Copiar Char Array em C

Jinku Hu 12 outubro 2023
  1. Use a função memcpy para copiar un array de caracteres em C
  2. Use a função memmove para copiar un array Char em C
Copiar Char Array em C

Este artigo irá demonstrar vários métodos sobre como copiar un array char em C.

Use a função memcpy para copiar un array de caracteres em C

Arrays char são provavelmente a estrutura de dados mais comum manipulada no código C, e copiar o conteúdo do array é uma das operações principais para isso. Strings de estilo C são muito semelhantes a arrays char; portanto, existem várias maneiras de lidar com a cópia do conteúdo do array. No exemplo a seguir, declaramos duas arrays, arr e arr2; o primeiro é inicializado com notação de lista de caracteres e o último com uma string literal. Observe que isso produz diferentes estruturas e tamanhos de array. O objeto arr tem 7 caracteres na memória, mas arr2 leva 17 caracteres mais o byte nulo de terminação resultando em um objeto de 18 bytes. Consequentemente, passamos o valor da expressão sizeof arr2 - 1 como o segundo argumento para denotar o comprimento do array. Por outro lado, pode-se imprimir o conteúdo do array arr2 com a função printf e o especificador de formato %s.

Os mesmos detalhes devem ser considerados ao copiar as arrays char para um local diferente. A função memcpy é parte dos utilitários de string de biblioteca padrão definidos no arquivo de cabeçalho <string.h>. Leva três parâmetros, o primeiro dos quais é o ponteiro de destino, onde o conteúdo do array será copiado. O segundo parâmetro é o ponteiro para a matriz de origem e o último parâmetro especifica o número de bytes a serem copiados. Observe que o operador sizeof retorna os tamanhos de objeto do array char em bytes. Assim, alocamos a memória dinâmica com a chamada malloc passando o valor da expressão sizeof arr para ela. A região de memória retornada é suficiente para conter o conteúdo arr, e não precisamos nos preocupar com erros de estouro de buffer. Lembre-se, porém, de que o ponteiro retornado de malloc deve ser liberado.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printCharArray(char *arr, size_t len) {
  for (size_t i = 0; i < len; ++i) {
    printf("%c, ", arr[i]);
  }
  printf("\n");
}

int main(int argc, char *argv[]) {
  char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  char arr2[] = "array initialized";

  printf("%lu\n", sizeof arr);
  printf("%lu\n", sizeof arr2);

  printCharArray(arr, sizeof arr);
  printCharArray(arr2, sizeof arr2 - 1);

  char *str = malloc(sizeof arr);
  memcpy(str, arr, sizeof arr);
  printf("str: ");
  printCharArray(str, sizeof arr);
  free(str);

  str = malloc(sizeof arr2);
  memcpy(str, arr2, sizeof arr2);
  printf("str: %s\n", str);
  free(str);

  exit(EXIT_SUCCESS);
}

Resultado:

7
18
a, b, c, d, e, f, g,
a, r, r, a, y,  , i, n, i, t, i, a, l, i, z, e, d,
str: a, b, c, d, e, f, g,
str: array initialized

Use a função memmove para copiar un array Char em C

memmove é outra função de cópia de área de memória de utilitários de string de biblioteca padrão. Ele foi implementado como uma função mais robusta para acomodar o caso em que as regiões de memória de destino e de origem se sobrepõem. Os parâmetros memmove são iguais aos memcpy.

Ao copiar o conteúdo arr2, passamos a expressão sizeof arr2 como o terceiro parâmetro. O que significa que até mesmo o byte nulo de terminação foi copiado para o ponteiro de destino, mas consequentemente utilizamos essa ação chamando printf com %s para o conteúdo de saída em vez de usar printCharArray.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void printCharArray(char *arr, size_t len) {
  for (size_t i = 0; i < len; ++i) {
    printf("%c, ", arr[i]);
  }
  printf("\n");
}

int main(int argc, char *argv[]) {
  char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  char arr2[] = "array initialized";

  char *str = malloc(sizeof arr);
  memmove(str, arr, sizeof arr);
  printf("str: ");
  printCharArray(str, sizeof arr);
  free(str);

  str = malloc(sizeof arr2);
  memmove(str, arr2, sizeof arr2);
  printf("str: %s\n", str);
  free(str);

  exit(EXIT_SUCCESS);
}

Resultado:

str: a, b, c, d, e, f, g,
str: array initialized
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 Array