Come stampare un array da funzione?

di il
5 risposte

Come stampare un array da funzione?

Buonasera,
devo scrivere un programma che acquisisca una stringa contenente spazi e restituisca un array di interi, ogni elemento del quale indica la posizione degli spazi nella stringa.
Esempio:
“Questa è una frase"
output: [6, 8,12].
Ci sono alcuni vincoli tra cui il creare delle funzioni una delle quali deve essere: int* posizione_spazi(char* s, int spazi) che prende in input la stringa e il numero di spazi e restituisce un array di interi, ogni elemento del quale indica la posizione di uno spazio.
La stampa dell’array di interi contenente le posizioni degli spazi deve avvenire dal main.
Non riesco a farlo.

La stampa, se lanciata dalla funzione, restituisce i valori corretti (ho lasciato la printf apposta); se lanciata del main, non fuziona. Sicuramente è perché l'array contenente la posizione degli spazi è interno alla funzione ma non so come risolvere.
#include <stdio.h>

int conta_spazi(char frase[]);
int* posizione_spazi(char frase[], int conta);
int conta=0;

main ()
{

char frase[]="Q uestae una frase";
int* puntator;



int conta =  conta_spazi(frase);

printf("%s\n", frase);
puntator = posizione_spazi(frase, conta);

for(int i=0; i<conta; i++ )
    printf("SPAZI %d \n", *puntator++);



system("pause");

return 0;
}

int conta_spazi(char frase[]){
int conta=0;
int i=0;
while(frase[i]!='\0'){
if (frase[i]==32){conta++;}
//printf("char %c --- %d --- %d\n", frase[i], frase[i], conta);//un semplice controllo che stampa ogni lettere il codice ascii e il numero di spazi
i++;
}
printf("Gli spazi all'interno della frase sono:  %d\n", conta);
return conta;
}


int* posizione_spazi(char frase[], int conta){


int i=0;
int j=0;
int* puntatore;
int nuovo_array[conta];

while(frase[i]!='\0'){
if (frase[i]==32){nuovo_array[j]=i; printf("nuovo_array %d --- %d\n", nuovo_array[j], &nuovo_array[j]); j++;}
i++;
}


puntatore=&nuovo_array[0];

return puntatore;
}

Cosa sbaglio?
Grazie

5 Risposte

  • Re: Come stampare un array da funzione?

    È proprio quello l'errore. Devi allocare il nuovo array dinamicamente con una malloc (in C) o con una new (in C++).
    Restituire un puntatore a un oggetto che muore nella funzione causa un errore di dangling pointer.
  • Re: Come stampare un array da funzione?

    Fammi capire. Prima ancora di una soluzione voglio capire a livello teorico.
    Cosa comporta allocare il nuovo array dinamicamente con una malloc?
    Tra l'altro ho creato una versione funzionante dichiarando l'array nel main! Ma così vado fuori traccia perché poi sono costretto a passare un parametro in più (appunto, ilnuovo array) che nella traccia non è menzionato.

    Per completezza posto il codice funzionante ma fuori traccia.
    #include <stdio.h>
    
    int conta_spazi(char frase[]);
    int* posizione_spazi(char frase[], int conta, int nuovo_array[]);
    int conta=0;
    
    main ()
    {
    
    char frase[]="Q uestae una frase";
    int* puntator;
    
    
    
    int conta =  conta_spazi(frase);
    int nuovo_array_main[conta];
    
    printf("%s\n", frase);
    
    posizione_spazi(frase, conta, nuovo_array_main);
    for(int i=0; i<conta; i++ )
        printf("Stampa all'interno del main %d \n", nuovo_array_main[i]);
    
    
    
    system("pause");
    
    return 0;
    }
    
    int conta_spazi(char frase[]){
    int conta=0;
    int i=0;
    while(frase[i]!='\0'){
    if (frase[i]==32){conta++;}
    //printf("char %c --- %d --- %d\n", frase[i], frase[i], conta);//un semplice controllo che stampa ogni lettere il codice ascii e il numero di spazi
    i++;
    }
    printf("Gli spazi all'interno della frase sono:  %d\n", conta);
    return conta;
    }
    
    
    int* posizione_spazi(char frase[], int conta, int nuovo_array[]){
    
    
    int i=0;
    int j=0;
    int* puntatore;
    
    
    while(frase[i]!='\0'){
    if (frase[i]==32){nuovo_array[j]=i; printf("Stampa all'interno della funzione %d\n", nuovo_array[j]); j++;}
    i++;
    }
    
    
    
    return puntatore;
    }
    
  • Re: Come stampare un array da funzione?

    Sai che le variabili locali sono distrutte all'uscita della funzione? È quello che succede al tuo array e il puntatore punta a memoria non più allocata (nello stack).

    Se l'array lo allochi dinamicamente (nell'heap) esisterà anche al termine della funzione.
  • Re: Come stampare un array da funzione?

    Grazie approfondirò.
    Gentili e qualificati come sempre.
  • Re: Come stampare un array da funzione?

    Prego ma sono le basi del C... dovresti averle sul tuo libro
Devi accedere o registrarti per scrivere nel forum
5 risposte