Copiar Char Array en C

Jinku Hu 12 octubre 2023
  1. Utilice la función memcpy para copiar un array de caracteres en C
  2. Utilice la función memmove para copiar uun arrayde caracteres en C
Copiar Char Array en C

Este artículo demostrará varios métodos sobre cómo copiar un array de caracteres en C.

Utilice la función memcpy para copiar un array de caracteres en C

Los arrays char son probablemente la estructura de datos más común manipulada en el código C, y copiar el contenido del array es una de sus operaciones principales. Las cadenas de estilo C son muy similares a los Arrays char; por lo tanto, hay varias formas de lidiar con la copia del contenido del array. En el siguiente ejemplo, declaramos dos arrays, arr y arr2; el primero se inicializa con la notación de lista de caracteres y el segundo con un literal de cadena. Tenga en cuenta que esto produce diferentes estructuras y tamaños de array. El objeto arr tiene 7 caracteres en la memoria, pero arr2 toma 17 caracteres más el byte nulo de terminación que da como resultado un objeto de 18 bytes. En consecuencia, pasamos el valor de la expresión sizeof arr2 - 1 como segundo argumento para indicar la longitud del array. Por otro lado, se puede imprimir el contenido del array arr2 con la función printf y el especificador de formato %s.

Deben tenerse en cuenta los mismos detalles al copiar los Arrays char en una ubicación diferente. La función memcpy es parte de las utilidades de cadena de biblioteca estándar definidas en el archivo de encabezado <string.h>. Se necesitan tres parámetros, el primero de los cuales es el puntero de destino, donde se copiará el contenido del array. El segundo parámetro es el puntero a el array de origen y el último parámetro especifica el número de bytes que se copiarán. Observe que el operador sizeof devuelve los tamaños de objeto del array char en bytes. Así que asignamos la memoria dinámica con la llamada malloc pasándole el valor de la expresión sizeof arr. La región de memoria devuelta es suficiente para contener el contenido de arr, y no tenemos que preocuparnos por los errores de desbordamiento del búfer. Sin embargo, tenga en cuenta que el puntero devuelto por malloc debe liberarse.

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

Producción :

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

Utilice la función memmove para copiar uun arrayde caracteres en C

memmove es otra función de copia del área de memoria de las utilidades de cadenas de bibliotecas estándar. Se ha implementado como una función más robusta para adaptarse al caso cuando las regiones de memoria de origen y destino se superponen. Los parámetros de memmove son los mismos que los de memcpy.

Al copiar el contenido de arr2, pasamos la expresión sizeof arr2 como tercer parámetro. Lo que significa que incluso el byte nulo de terminación se copió en el puntero de destino, pero en consecuencia utilizamos esta acción llamando a printf con %s para generar contenidos en lugar 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);
}

Producción :

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

Artículo relacionado - C Array