elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con función que devuelve substring
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con función que devuelve substring  (Leído 2,548 veces)
Shon

Desconectado Desconectado

Mensajes: 34


Ver Perfil
Ayuda con función que devuelve substring
« en: 19 Septiembre 2010, 20:06 pm »

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.


Código
  1. char ** substring(const char *cadena, const char *inicio, const char *fin, int *num_ocurrencias);
  2.  
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:
Código
  1. char **substring(const char *cad, const char *begin, const char *end, int *num_ocurrencias) {
  2. char *p, *q;
  3. char **ppc;
  4. int i = 0 , j  = 0;
  5.  
  6.  
  7. for(;;i++) {
  8. p = strstr(cad, begin);
  9. if (p == NULL) break;
  10.  
  11. q = strstr(cad, end);
  12. if (q == NULL) break;
  13.  
  14. p += strlen(begin);
  15. ppc = (char **) realloc(ppc, sizeof(char *) * i+1);
  16. ppc[i] = (char *) realloc(ppc[i], (q - p + 2) * sizeof(char));
  17.  
  18. for (j = 0; j < q-p; j++)
  19. ppc[i][j] = *(p + j);
  20.  
  21. ppc[i][j] = '\0';
  22.  
  23. cad = q + strlen(end);
  24. }
  25. i--;
  26.  
  27. *num_ocurrencias = i;
  28.  
  29. return ppc;
  30. }
  31.  

Cuando invoco a la función:
Código
  1. char **encontrados = NULL;
  2. int num_referencias = 0;
  3.  
  4. encontrados = substring(el_texto, "Inicio", "Fin", &num_referencias);
  5.  
  6. ....
  7.  
  8. for (i = 0; i < num_referencias; i++) {
  9.    free(encontrados[i]);
  10. free(encontrados);
  11. }
  12.  


Parece que funciona.

Un saludo


« Última modificación: 20 Septiembre 2010, 01:24 am por Littlehorse » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines