Esercizio sulla funzione memmove in c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *stringa="Hello world";
char *s2, *s3;
size_t m=4;
s2=malloc(10*sizeof(char));
memcpy(s2, stringa, m);
puts(s2);
s3=malloc(10*sizeof(char));
memmove(s3, stringa, m);
puts(s3);
return 0;
}
non riesco a capire perhè stampa, invece di hell, un carattere che che ''non riesco a vedere'' e poi ''ell''
Risposte
Ti sei dimenticato di aggiungere il terminatore di stringa o di azzerare la stringa prima di copiare o muovere i caratteri.
Ma quando faccio
non viene inserito in automatico il terminatore di stringa?
E poi quale stringa dovrei azzerare? Alle due funzioni passo due stringhe diverse su cui copiare la prima, cioè la prima funzione copia i bit di stringa in s1 e la seconda copia i bit di stringa su s2 non voglio che stringa cambi valore perchè stavo provando praticamente le differenze tra le funzioni memmove e memcpy
e poi se modifico la variabile m ponendola uguale a tre mi stampa la stringa corretta mentre per ogni altro valore fino a 10 (la lunghezza della stringa) no
char *stringa="Hello world";
non viene inserito in automatico il terminatore di stringa?
E poi quale stringa dovrei azzerare? Alle due funzioni passo due stringhe diverse su cui copiare la prima, cioè la prima funzione copia i bit di stringa in s1 e la seconda copia i bit di stringa su s2 non voglio che stringa cambi valore perchè stavo provando praticamente le differenze tra le funzioni memmove e memcpy
e poi se modifico la variabile m ponendola uguale a tre mi stampa la stringa corretta mentre per ogni altro valore fino a 10 (la lunghezza della stringa) no
"simoorusso":
Ma quando faccio
char *stringa="Hello world";
non viene inserito in automatico il terminatore di stringa?
E poi quale stringa dovrei azzerare? Alle due funzioni passo due stringhe diverse su cui copiare la prima, cioè la prima funzione copia i bit di stringa in s1 e la seconda copia i bit di stringa su s2 non voglio che stringa cambi valore perchè stavo provando praticamente le differenze tra le funzioni memmove e memcpy
e poi se modifico la variabile m ponendola uguale a tre mi stampa la stringa corretta mentre per ogni altro valore fino a 10 (la lunghezza della stringa) no
Ok scusami ora ho capito le funzioni memmove e memcpy non aggiungo il terminatore a s2 ed s3 quindi lo devo aggiungere "manualmente" facendo
s2=malloc(10*sizeof(char));
memcpy(s2, stringa, m);
*(s2+m)='\0';
puts(s2);e stesso discorso per s3, giusto?
Si, comunque puoi scrivere [inline]s2[m][/inline] invece di [inline]*(s2+m)[/inline]. O avresti anche potuto usare calloc che azzera l'intero array di default.