Copiar Char Array en C
-
Utilice la función
memcpy
para copiar un array de caracteres en C -
Utilice la función
memmove
para copiar uun arrayde caracteres 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
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