Esercizio sulla funzione memmove in c

97.russo
#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
vict85
Ti sei dimenticato di aggiungere il terminatore di stringa o di azzerare la stringa prima di copiare o muovere i caratteri.

97.russo
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

97.russo
"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?

vict85
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.