Discussione:
Funzione memcpy() in C
(troppo vecchio per rispondere)
NERO23
2013-02-25 18:56:54 UTC
Permalink
#include <stdio.h>
#include <string.h>

int main(void)
{
char s1[17];
char s2[] = "Bella partita";
memcpy(s1, s2, 7);
printf("%s\n", s1); // VISUALIZZA: Bella p@
return 0;
}

La funzione memcpy() dovrebbe copiare i primi sette caratteri del
testo "Bella partita" nel vettore s1.

Quando vado a stampare, in realtà mi ritrovo i sette caratteri più il
carattere '@' (in altre prove che ho fatto mi ritrovavo altri simboli
strani).

Perchè si verifica questo?
Devo dedurre che la dichiarazione del vettore s1 viene sovrapposta su
celle già sporche di dati precedentemente utilizzate?

Ciao

nero23
f***@gmail.com
2013-02-25 19:27:21 UTC
Permalink
<snip>
Perché manca il terminatore di stringa in s1!

Hai due alternative:
- utilizzi strcpy()
- metti a mano il terminatore (se volevi 7 caratteri, s1[8]='\0')

Ciao!
NERO23
2013-02-25 19:53:53 UTC
Permalink
Ho provato questa soluzione e funziona.
char s1[17]=" ";


Ciao e grazie
f***@gmail.com
2013-02-25 19:57:55 UTC
Permalink
Post by NERO23
Ho provato questa soluzione e funziona.
char s1[17]=" ";
Vero. L'importante è che hai capito *perché* funziona: ti anticipo che non è
immediato ( per gli altri, non date suggerimenti subito! :D )

Ciao!
ITRON
2013-02-26 07:16:32 UTC
Permalink
Post by f***@gmail.com
Post by NERO23
Ho provato questa soluzione e funziona.
char s1[17]=" ";
Vero. L'importante è che hai capito *perché* funziona: ti anticipo che non è
immediato ( per gli altri, non date suggerimenti subito! :D )
Ciao!
Non e' una soluzione e sopratutto e' bacogena :-)
Le "stringhe" in c sono sequenze di caratteri concluse da un
terminatore (0), che e' implicito .
char s1 e' l' array di destinazione di una stringa:
memcpy copia un certo numero di caratteri da un array ad un altro,
indipendentemente dal contenuto:
se l' array di partenza contiene 0 (NULL), l'array di arrivo sara'
azzerato e non conterra' nessuna stringa :-)
Se si copia parzialmente una stringa, non e' garantito che l' ultimo
carattere copiato sia un NULL per cui puo' capitare di avere spazzatura
nella nuova stringa a meno di copiare manualmente il teminatore all'
ultima posizizione+1.
La tua soluzione causa la copia in s1[0]=' ' e l'azzeramento del resto
del buffer : quindi quando ci copi dentro 7 caratteri, l' 8 e' 0 e
la stringa e' terminata.
Questa soluzione e' bacogena perche':
- Inizializza inutilmente s1 : se vuoi una stringa
inizializzata a 0, e' piu' logico s1[17]="";
visto che non hai necessita di avere caratteri.
- non funziona dopo che s1 viene utilizzato se si usano
stringhe di lunghezza diversa
- E' MOLTO piu' corretto usare a) stncpy se vuoi copiare
una stringa compreso il terminatore o b) se vuoi solo
copiare parte di una stringa con memcpy, iserire
esplicitamente il terminatore s1[n]=0, con n=ultimo indice+1.

ii
f***@gmail.com
2013-02-26 08:53:23 UTC
Permalink
Post by ITRON
Post by NERO23
Ho provato questa soluzione e funziona.
char s1[17]=" ";
Vero. L'importante � che hai capito *perch�* funziona: ti anticipo che
non � immediato ( per gli altri, non date suggerimenti subito! :D )
La tua soluzione causa la copia in s1[0]=' ' e l'azzeramento del resto
del buffer : quindi quando ci copi dentro 7 caratteri, l' 8 e' 0 e
la stringa e' terminata.
Certo, questo era il perché.
Post by ITRON
- Inizializza inutilmente s1 : se vuoi una stringa
inizializzata a 0, e' piu' logico s1[17]="";
visto che non hai necessita di avere caratteri.
a questo punto meglio s1[17] = { 0 };
Post by ITRON
- non funziona dopo che s1 viene utilizzato se si usano
stringhe di lunghezza diversa
ovvio. Per questo dicevo che era importante per l'OP capire perché funzionasse
in questo caso.
Post by ITRON
- E' MOLTO piu' corretto usare a) stncpy se vuoi copiare
una stringa compreso il terminatore o b) se vuoi solo
copiare parte di una stringa con memcpy, iserire
esplicitamente il terminatore s1[n]=0, con n=ultimo indice+1.
A dirla tutta sarebbe più corretto utilizzare il classico strncpy()+set del
terminatore.

Ciao!

Loading...