Copia array di caratteri in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione memcpy per copiare un array di caratteri in C
  2. Usa la funzione memmove per copiare un array di caratteri in C
Copia array di caratteri in C

Questo articolo illustrerà più metodi su come copiare un array di caratteri in C.

Usa la funzione memcpy per copiare un array di caratteri in C

Gli array char sono probabilmente la struttura dati più comune manipolata nel codice C, e la copia del contenuto dell’array è una delle sue operazioni principali. Le stringhe in stile C sono molto simili agli array char; quindi, ci sono diversi modi per gestire la copia del contenuto dell’array. Nell’esempio seguente, abbiamo dichiarato due array, arr e arr2; il primo è inizializzato con la notazione dell’lista di caratteri e il secondo con una stringa letterale. Notare che questo produce diverse strutture e dimensioni di array. L’oggetto arr è di 7 caratteri nella memoria, ma arr2 richiede 17 caratteri più un byte nullo di terminazione risultante in un oggetto di 18 byte. Di conseguenza, passiamo il valore dell’espressione sizeof arr2 - 1 come secondo argomento per indicare la lunghezza dell’array. D’altra parte, si può stampare il contenuto dell’array arr2 con la funzione printf e l’identificatore di formato %s.

Gli stessi dettagli dovrebbero essere considerati quando si copiano gli array char in una posizione diversa. La funzione memcpy fa parte delle utilità di stringa della libreria standard definite nel file di intestazione <string.h>. Richiede tre parametri, il primo dei quali è il puntatore di destinazione, dove verrà copiato il contenuto dell’array. Il secondo parametro è il puntatore all’array di origine e l’ultimo parametro specifica il numero di byte da copiare. Si noti che l’operatore sizeof restituisce le dimensioni degli oggetti dell’array char in byte. Quindi allochiamo la memoria dinamica con la chiamata malloc passandole il valore dell’espressione sizeof arr. La regione di memoria restituita è sufficiente per contenere il contenuto di arr e non dobbiamo preoccuparci dei bug di overflow del buffer. Ricorda però che il puntatore restituito da malloc dovrebbe essere liberato.

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

Produzione:

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

Usa la funzione memmove per copiare un array di caratteri in C

memmove è un’altra funzione di copia dell’area di memoria dalle utilità di stringa della libreria standard. È stata implementata come una funzione più robusta per adattarsi al caso in cui le regioni di memoria di destinazione e di origine si sovrappongono. I parametri di memmove sono gli stessi di memcpy.

Quando si copia il contenuto di arr2, abbiamo passato l’espressione sizeof arr2 come terzo parametro. Significa che anche il byte nullo di terminazione è stato copiato nel puntatore di destinazione, ma di conseguenza utilizziamo questa azione chiamando printf con %s per visualizzare i contenuti invece di usare 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);
}

Produzione:

str: a, b, c, d, e, f, g,
str: array initialized
Autore: 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

Articolo correlato - C Array