PDA

Visualizza la versione completa : [C] Funzione che ritorna stringa


Cranfi
08-02-2011, 22:55
Ciao a tutti, ho una domandina..
qual'è la sintassi per ritornare al main() una stringa elaborata da una funzione?Devo scriver return "????"; :confused:
Vi posto il codice..
Grazie! :D


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNUM 100

int funzione(char *stringa_dove_cercare, char *stringa_da_cercare);

int main()
{
char v[MAXNUM], w[MAXNUM];

printf("Introduci la stringa: ");
gets(v);
printf("Introduci la stringa: ");
gets(w);

printf("risultato %c \n", funzione(v,w));

return EXIT_SUCCESS;
}

/*--------------------------------------------------------*/
int funzione(char *a, char *x)
{
int i,lx;
char esito[MAXNUM];
lx=strlen(x);
for (i=0;i<lx-1;i++)
{
esito[i]=x[i];
esito[i+1]=a[i];
}

return ???????;
}

Celebron
08-02-2011, 23:10
la funzione deve essere definita come char*
e ovviamente il return deve restituire una variabile di tipo char*

in tal caso la tua printf dovrebbe avere un %s, non un %c

in ogni caso la funzione che hai creato non ha molto senso
principalmente perchè la parte che copi da "a" non verrà mai salvata, visto che all'iterazione successiva sarà occupata da quella di "x"
in secondo luogo perchè, se vuoi che la printf %s non ti dia errori, devi aggiungere il carattere di terminazione stringa.

Laikius91
09-02-2011, 08:06
Celebron ha ragione, per prima cosa l'interfaccia della funzione deve essere:

char* funzione(char *stringa_dove_cercare, char *stringa_da_cercare);


Poi c'è una questione da considerare, se nella tua funzione tu fai:



char esito[MAXNUM];

/*codice della funzione*/

return esito;


il compilatore dovrebbe darti un warning del tipo: "function 'funzione' return a local variable", che ti indica che tu ritorni come risultato della funzione una stringa variabile locale di 'funzione' e che quindi, terminata questa funzione, cesserà di esistere!
Per far si che "continui ad esistere" dopo che 'funzione' è terminata e che quindi possa essere correttamente ritornata occorre allocare dinamicamente, facendo:



char* esito;
esito = (char*) malloc (MAXNUM*sizeof(char));
/*codice della funzione*/
return esito;


Nel main però è fondamentale, prima di terminare il programma, liberare la memoria allocata con la free(). Quindi ti conviene fare tipo:



char* result;
result = funzione (v, w);

/*usi result come ti serve*/

free (result);
return 0;


Detto ciò, come evidenziato da Celebron, la tua funzione non funziona ( :D ) molto, ma è un altro paio di maniche! :)

Cranfi
09-02-2011, 12:39
Grazie dei consigli..ma in che senso "a"non viene salvata?La passo come valore e la gestisco come argomento..giusto?!? :confused:
Lo scopo è creare una funzione che che prese due stringhe le faccia visualizzare in modo alternato, esempio: pippo + PLUTO --> p P i L p U p T o O.

Laikius91
09-02-2011, 13:09
Originariamente inviato da Cranfi
Grazie dei consigli..ma in che senso "a"non viene salvata?La passo come valore e la gestisco come argomento..giusto?!? :confused:
Lo scopo è creare una funzione che che prese due stringhe le faccia visualizzare in modo alternato, esempio: pippo + PLUTO --> p P i L p U p T o O.


Il problema, parecchio incasinato, sta in questo ciclo:



for (i=0;i<lx-1;i++)
{
esito[i]=x[i];
esito[i+1]=a[i];
}


Partiamo anche solo dalla prima iterazione: i vale 0, nella prima cella di esito (esito[0]) salvi la parte che t'interessa di x, poi nella seconda cella di esito (esito[0+1= 1]) salvi la parte che t'interessa di a; finito il ciclo, i viene incrementato e ora vale 1. Alla seconda iterazione, la prima istruzione fa si che tu salvi la parte che t'interessa di x in esito[1], dove prima avevi scritto la parte di a, andando quindi a sovrascrivere! Puoi immaginare che la cosa si ripeta ad ogni ciclo!
Inoltre, se ho capito bene tu assumi per ipotesi che le due stringhe passate abbiano la stessa dimensione no? Detto ciò ti conviene fare tipo:



int dim = strlen(x) * 2 + 1; /*il doppio della dimensione di una stringa più lo spazio per il terminatore*/
char* esito;
int i = 0, j = 0;

esito = (char*) malloc (dim*sizeof(char));

for (i = 0; i < dim; i++)
{
esito[i] = x[j];
esito[++i] = a[j];
j++;
}
esito[i] = '\0'; /*inserisci il terminatore*/

return esito;


Così dovrebbe funzionare :)

Loading