Copier le tableau de caractères en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction memcpy pour copier un tableau de caractères en C
  2. Utilisez la fonction memmove pour copier un tableau de caractères en C
Copier le 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
Auteur: 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

Article connexe - C Array