PDA

View Full Version : [C] Separatore di stringhe


leadergl
13-01-2006, 08:25
Raga ho scritto questo codice per separare/estrarre, qualora mi dovesse servire, una sottostringa da una stringa originaria formattata in un determinato modo!

Es:
ho la stringa:
ciao mamma come va|oggi piove|4|cavallo
dove il mio carattere separatore è |
questo codice mi dovrebbe permettere di estrarre a piacere una delle quattro frasi/parole che si trovano tra ogni |, ma ci deve stare qualche errore subdolo:

char *separa(char *stringa, int occorrenze)
{
int numero; // contatore globale
int num; // contatore locale
char *destinazione=NULL;

destinazione=(char *)malloc(sizeof(strlen(stringa))+1);
numero=0;
while (occorrenze>0)
{
num=0;
while(stringa[numero]!='|')
{
destinazione[num]=stringa[numero];
numero++;
num++;
}
destinazione[num] = '\0';
occorrenze--;
numero++;
}
return destinazione;
}


Esempio:
[code]
int main()
{
char *temp=NULL;
char *origine="ciao mamma|2|prr|";

temp=separa(origine,2); //mi restituisce 2

system("PAUSE");
return 0;
}

se però eseguo più di una volta la chiamata quella funzione si verificano anomalie nel funzionamento del programma.....perchè? dove sbaglio?

andbin
13-01-2006, 09:46
se però eseguo più di una volta la chiamata quella funzione si verificano anomalie nel funzionamento del programma.....perchè? dove sbaglio?
Ciao, non ho provato il tuo codice ma a vista direi che qualcosa che non va c'è sicuramente. La prima cosa che mi è saltata all'occhio è:
destinazione=(char *)malloc(sizeof(strlen(stringa))+1);la sizeof non ci vuole (altrimenti allochi sempre e solo 5 bytes!).

Comunque, io l'avrei fatto così (permettimi di postare una mia soluzione ;) ):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *separa (char *str, int index)
{
char *s = str;
char *p;
char *ret;
int len;

/*---- Cerca l'inizio della sotto-stringa ----*/
while (index-- > 0)
{
if ((p = strchr (s, '|')) != NULL)
s = p+1;
else
return NULL;
}

/*---- Cerca la fine (e lunghezza) della sotto-stringa ----*/
if ((p = strchr (s, '|')) != NULL)
len = p - s;
else
len = strlen (s);

/*---- Alloca memoria e copia ----*/
if ((ret = (char *) malloc (len+1)) != NULL)
{
strncpy (ret, s, len);
ret[len] = '\0';
}

return ret;
}


int main (void)
{
char *origine = "ciao mamma|2|prr";
char *r;

r = separa (origine, 0);
printf ("[%s]\n", r); /* Stampa "ciao mamma" */
free (r);

r = separa (origine, 1);
printf ("[%s]\n", r); /* Stampa "2" */
free (r);

r = separa (origine, 2);
printf ("[%s]\n", r); /* Stampa "prr" */
free (r);

return 0;
}
La funzione separa() sembra più lunga ma come l'ho fatta io forse è più chiara perchè è composta da 3 parti ben precise. E ritorna NULL se non trova la sotto-stringa o se malloc ha fallito.
Ciao.

leadergl
13-01-2006, 10:36
perfetto, ti ringrazio..la tua soluzione funziona a meraviglia ;)

vorresti dare uno sguardo anche qui: http://www.hwupgrade.it/forum/showthread.php?t=1109604

ancora grazie ;)