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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Funcion Split
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Funcion Split  (Leído 3,554 veces)
mr.blood

Desconectado Desconectado

Mensajes: 150


Ver Perfil
[C] Funcion Split
« en: 28 Marzo 2013, 14:46 pm »

Espero que a alguien le sirva. Yo no he visto fallos, si los encontrais, comentadlos por favor.

Código
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4.  
  5. int len_palabra(char *cadena, int inicio, char separador);
  6. char **split(char *cadena, char separador);
  7.  
  8. int main()
  9. {
  10. char cadena[]="MrBlood.split.crea.funcion";
  11. int i;
  12. char **retorno=split(cadena, '.');
  13. for(i=0;retorno[i]!=NULL;i++)
  14. {
  15. printf("%s\n", retorno[i]);
  16. free(retorno[i]);
  17. }
  18. free(retorno);
  19. return 0;
  20. }
  21.  
  22. int len_palabra(char *cadena, int inicio, char separador)
  23. {
  24. int len=0, i=inicio;
  25. while(cadena[i]!=separador&&cadena[i]!='\0')
  26. {
  27. len++;
  28. i++;
  29. }
  30. return len;
  31. }
  32.  
  33. char **split(char *cadena, char separador)
  34. {
  35. int num_palabras=1, len_cadena=strlen(cadena), i, j=1, *inicios;
  36. for(i=0;i<len_cadena;i++)
  37. {
  38. if(cadena[i]==separador)
  39. {
  40. num_palabras++;
  41. }
  42. }
  43. inicios=malloc(sizeof(int)*num_palabras);
  44. inicios[0]=0;
  45. for(i=1;i<len_cadena;i++)
  46. {
  47. if(cadena[i]==separador)
  48. {
  49. inicios[j]=i+1;
  50. j++;
  51. }
  52. }
  53. char **retorno=malloc(sizeof(char *)*num_palabras+1);
  54. retorno[num_palabras]=NULL;
  55. for(i=0;i<num_palabras;i++)
  56. {
  57. j=len_palabra(cadena, inicios[i], separador);
  58. retorno[i]=(char *)malloc(sizeof(char)*j);
  59. strncpy(retorno[i], &cadena[inicios[i]], j);
  60. retorno[i][j]='\0';
  61. }
  62. free(inicios);
  63. return retorno;
  64. }
  65.  

Sa1uDoS

EDITO: Ahora se libera la memoria reservada con malloc.


« Última modificación: 28 Marzo 2013, 18:00 pm por mr.blood » En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: [C] Funcion Split
« Respuesta #1 en: 28 Marzo 2013, 16:29 pm »

Esta bien pero recuerda que debes hacerle free a cada palabra y luego al retorno porque estas dejando memory leaks. Otra cosa, sería interesante que el delimitador pudiera ser un string. Aquí te dejo una que hice yo, pero en C++ mucho más sencillo utilizando la clase string y vector:

http://gauss.com.ve/articulos/articulo.php?id=10


En línea

mr.blood

Desconectado Desconectado

Mensajes: 150


Ver Perfil
Re: [C] Funcion Split
« Respuesta #2 en: 28 Marzo 2013, 16:34 pm »

En realidad aunque es una buena costumbre usar free, el SO se encarga de liberar la memoria reservada cuando el proceso termina ;). Aun asi deberia mejorar eso.

Sa1uDoS
En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: [C] Funcion Split
« Respuesta #3 en: 28 Marzo 2013, 16:36 pm »

En realidad aunque es una buena costumbre usar free, el SO se encarga de liberar la memoria reservada cuando el proceso termina ;). Aun asi deberia mejorar eso.

Sa1uDoS

Sí, pero que tal si mi proceso es un servidor que va a correr durante meses usando esa función split cada vez que recibe alguna petición? En cierto punto va a reventar. Fuera de eso, muy bueno el aporte.
En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: [C] Funcion Split
« Respuesta #4 en: 28 Marzo 2013, 21:48 pm »

Y para molestar un poco mas faltaria comprobar q malloc asigne memoria correctamente


Saludos
En línea

Ahorrate una pregunta, lee el man
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [C] Funcion Split
« Respuesta #5 en: 29 Marzo 2013, 06:11 am »

Espero que a alguien le sirva. Yo no he visto fallos, si los encontrais, comentadlos por favor.
Algunos comentarios:

* Para tener acceso al prototipo de malloc es mejor, en lugar de <malloc.h>, incluir <stdlib.h> ya que este ultimo es parte de la biblioteca estándar de C.

* Cuando reservas memoria para cada parte de la cadena debes utilizar "j + 1", el elemento adicional es para almacenar ahí el '\0'.

* En lugar de copiar la cadena y a continuación almacenar manualmente el '\0':
Código
  1. strncpy(retorno[i], &cadena[inicios[i]], j);
  2. retorno[i][j] = '\0';
Puedes realizar los dos pasos con sprintf:
Código
  1. sprintf(retorno[i], "%.*s", j, cadena + inicios[i]);

* En la función "len_palabra" puedes obtener el numero de caracteres utilizando solo una variable local, de esta forma:
Código
  1. int len_palabra(char *cadena, int inicio, char separador)
  2. {
  3.   int i = inicio;
  4.  
  5.   while (cadena[i] != separador && cadena[i] != '\0')
  6.      i++;
  7.  
  8.   return i - inicio;
  9. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
mr.blood

Desconectado Desconectado

Mensajes: 150


Ver Perfil
Re: [C] Funcion Split
« Respuesta #6 en: 29 Marzo 2013, 10:43 am »

La funcion len_palabra puedo eliminarla y aprovechar el for donde busco los inicios, pero muy buen apunte. Luego cambio todo esto.
Lo del sprintf ni se me ocurrio.

Gracias a todos por los comentarios, en especial a @rir3760. Luego lo cambio y edito.

Sa1uDoS
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[batch] funcion split
Scripting
z_ane_666 1 2,502 Último mensaje 3 Enero 2011, 20:55 pm
por xassiz~
[C]Función SPLIT
Programación C/C++
Binary_Death 7 4,553 Último mensaje 4 Octubre 2011, 17:19 pm
por Binary_Death
Función Split VB.NET
.NET (C#, VB.NET, ASP)
R3Z 7 6,079 Último mensaje 4 Noviembre 2015, 05:03 am
por R3Z
Consulta: Función Split
Programación Visual Basic
jack06 4 2,775 Último mensaje 9 Mayo 2017, 00:58 am
por jack06
Función split para separar valores recibidos por un arduino
.NET (C#, VB.NET, ASP)
Rupertito 1 2,020 Último mensaje 27 Noviembre 2019, 16:58 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines