Copia array di caratteri in C
-
Usa la funzione
memcpy
per copiare un array di caratteri in C -
Usa la funzione
memmove
per copiare un 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
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