Char[] non si reinizializza!

di il
4 risposte

Char[] non si reinizializza!

Buonasera. Vorrei essere aiutato a capire perchè questo semplicissimo codice non va.
Non guardate la funzionalità che è nulla e mi serve solo per porre il problema.
In pratica passo 3 stringhe alla funzione 'Copia' la quale provvede a creare una nuova stringa (un char con n caratteri) uguale a quella passata, copiandola carattere per carattere per poi mostrarla a video.
Passando "pistolero", "aldo" e "mese" dovrebbe mostrare appunto le stesse parole e invece mostra:
pistolero
aldolero
meselero

Il problema è nella variabile 'newstring' che non viene "azzerata" ad ogni chiamata della funzione. Ma rimane con i caratteri dell'ultima parola poui lunga. Perchè? Non dovrebbe reinzializzarsi ad ogni chiamata? (Non sono esperto di C, quindi magari dico cose errate..)
Grazie a chi potrà spiegarmi perchè ciò accade.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void Copia(char str[])
{
    int j; 
    int lungh;
    lungh = strlen(str);
    char newstring [lungh];
    
    for (j=0;j<lungh;j++)
        newstring[j]=str[j];
 
        printf("\n%s", newstring);
}

int main()
{  
    char testo[3][30]={"pistolero","aldo","mese"};

    for (int i=0;i<3;i++)
        Copia(testo[i]);
    
    return EXIT_SUCCESS;
}

4 Risposte

  • Re: Char[] non si reinizializza!

    O fai un
    memset(newstr, 0, lungh)
    oppure metti un '\0' come ultimo carattere dopo la copia, all'uscita del for
    newstring[lungh]='\0';
  • Re: Char[] non si reinizializza!

    Grazie per la celere risposta. Ma vorrei capire il perchè la newstring conserva caratteri di precedenti chiamate.
    Io uso abbastanza Vb e li ad ogni
    dim stringa as string
    
    stringa viene reinizializzata/svuotata del tutto.
    A cosa serve allora l'istruzione
    
    char newstring[lungh]?
    
    In C quindi non si puo mai essere sicuri di avere a che fare con una variabile vuota se ho ben capito ?
  • Re: Char[] non si reinizializza!

    Infatti in C allochi lo spazio ma non imposti il valore, non inizializzi la variabile (se non in alcuni casi), se non in modo esplicito.

    Quindi trovi al loro interno dei valori casuali, determinati anche dalle precedenti esecuzioni del codice.
  • Re: Char[] non si reinizializza!

    Il C è usato anche in contesti dove inizializzare un array potrebbe essere una perdita di tempo significativa.
    Comunque se usi array a dimensione fissa puoi anche inizializzare con = {0};
Devi accedere o registrarti per scrivere nel forum
4 risposte