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.