Ayuda con función que devuelve substring

Iniciado por Shon, 19 Septiembre 2010, 20:06 PM

0 Miembros y 1 Visitante están viendo este tema.

Shon

Hola,

Tengo un array de caracteres, p.e:
char texto[100];

Este tiene datos que tengo que parsear para sacar ciertos valores que me interesan.

Quiero hacer una función que me devuelva los substring que hay entre 2 delimitadores.

Si tengo está frase:
Hola, estoy es una prueba.

Si invoco la funcion conlos delimitadores "estoy" y "prueba", me devolvería: es una.
Si hay varias cadenas encerradas entre otros estoy y prueba, me los deolveria también.

Necesito, que me devuelva todas las ocurrencias posibles y el número de estas para luego poder manejarlas en mi programa.

Estoy pensando en como hacerlo pero estoy un poco duditativo. Dentro de la función, he pensado usar strstr para sacar los punteros a "estoy" y "prueba" y con estos datos operarar para sacar la cadena resultante. Pero no sé muy bien, como implementar la llamada la función, gestionar la memoria arrays estáticos o memoria dinámica que pueda manejar y como devolverlos, etc...

Así que me vendría bien que me dieseis ideas de como hacerlo, de cómo obtener, por ejemplo, un string de cadenas con cada ocurrencia y luego otra variable que me indique el nº de estas.



char ** substring(const char *cadena, const char *inicio, const char *fin, int *num_ocurrencias);

Algo así tengo por ahora.. iré poniendo lo que se me ocurra. Cualquier sugerencia es bien recibida :)

Gracias adelantadas y perdón por el tocho :P

Lh: No hagas doble post, utiliza el botón modificar.

A ver que os parece esto:

char **substring(const char *cad, const char *begin, const char *end, int *num_ocurrencias) {
char *p, *q;
char **ppc;
int i = 0 , j  = 0;


for(;;i++) {
p = strstr(cad, begin);
if (p == NULL) break;

q = strstr(cad, end);
if (q == NULL) break;

p += strlen(begin);
ppc = (char **) realloc(ppc, sizeof(char *) * i+1);
ppc[i] = (char *) realloc(ppc[i], (q - p + 2) * sizeof(char));

for (j = 0; j < q-p; j++)
ppc[i][j] = *(p + j);

ppc[i][j] = '\0';

cad = q + strlen(end);
}
i--;

*num_ocurrencias = i;

return ppc;
}


Cuando invoco a la función:

char **encontrados = NULL;
int num_referencias = 0;

encontrados = substring(el_texto, "Inicio", "Fin", &num_referencias);

....

for (i = 0; i < num_referencias; i++) {
   free(encontrados[i]);
free(encontrados);
}



Parece que funciona.

Un saludo