Copiar Char Array em C
-
Use a função
memcpy
para copiar un array de caracteres em C -
Use a função
memmove
para copiar un array Char 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
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