Copier le tableau de caractères en C
-
Utiliser la fonction
memcpy
pour copier un tableau de caractères en C -
Utilisez la fonction
memmove
pour copier un tableau de caractères en C
Cet article présente plusieurs méthodes permettant de copier un tableau de caractères en C.
Utiliser la fonction memcpy
pour copier un tableau de caractères en C
Les tableaux char
sont probablement la structure de données la plus courante manipulée dans le code C, et la copie du contenu du tableau est l’une des opérations de base de celui-ci. Les chaînes de style C sont très similaires aux tableaux char
; ainsi, il y a de multiples façons de traiter la copie du contenu des tableaux. Dans l’exemple suivant, nous avons déclaré deux tableaux, arr
et arr2
; le premier est initialisé avec la notation de liste de caractères et le second avec une chaîne littérale. Notez que cela donne des structures et des tailles de tableau différentes. L’objet arr
est de 7 caractères en mémoire, mais arr2
prend 17 caractères plus l’octet nul de terminaison, ce qui donne un objet de 18 octets. Par conséquent, nous passons la valeur de l’expression sizeof arr2 - 1
comme deuxième argument pour indiquer la longueur du tableau. D’autre part, on peut imprimer le contenu du tableau arr2
avec la fonction printf
et le spécificateur de format %s
.
Les mêmes détails doivent être pris en compte lorsque l’on copie les tableaux char
vers un autre emplacement. La fonction memcpy
fait partie de la bibliothèque standard des utilitaires de chaînes de caractères définie dans le fichier d’en-tête <string.h>
. Elle prend trois paramètres, dont le premier est le pointeur de destination, où le contenu du tableau sera copié. Le deuxième paramètre est le pointeur vers le tableau source, et le dernier paramètre spécifie le nombre d’octets à copier. Notez que l’opérateur sizeof
renvoie la taille des objets du tableau char
en octets. Nous allouons donc la mémoire dynamique avec l’appel malloc
lui passant la valeur de l’expression sizeof arr
. La région mémoire retournée est suffisante pour contenir le contenu de arr
, et nous n’avons pas à nous soucier des bogues de débordement de tampon. Mais attention, le pointeur renvoyé par malloc
doit être libéré.
#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);
}
Production :
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
Utilisez la fonction memmove
pour copier un tableau de caractères en C
memmove
est une autre fonction de copie de zone mémoire des utilitaires de chaînes de bibliothèque standard. Elle a été implémentée comme une fonction plus robuste pour s’adapter au cas où les zones de mémoire source et destination se chevauchent. Les paramètres de memmove
sont les mêmes que ceux de memcpy
.
En copiant le contenu de arr2
, nous avons passé l’expression sizeof arr2
comme troisième paramètre. Ce qui signifie que même l’octet nul de fin a été copié sur le pointeur de destination, mais nous utilisons par conséquent cette action en appelant printf
avec %s
pour sortir le contenu plutôt que d’utiliser 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);
}
Production :
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