Autor
|
Tema: [C] Funcion Split (Leído 4,012 veces)
|
mr.blood
Desconectado
Mensajes: 150
|
Espero que a alguien le sirva. Yo no he visto fallos, si los encontrais, comentadlos por favor. #include <stdio.h> #include <malloc.h> #include <string.h> int len_palabra(char *cadena, int inicio, char separador); char **split(char *cadena, char separador); int main() { char cadena[]="MrBlood.split.crea.funcion"; int i; char **retorno=split(cadena, '.'); for(i=0;retorno[i]!=NULL;i++) { } return 0; } int len_palabra(char *cadena, int inicio, char separador) { int len=0, i=inicio; while(cadena[i]!=separador&&cadena[i]!='\0') { len++; i++; } return len; } char **split(char *cadena, char separador) { int num_palabras =1, len_cadena =strlen(cadena ), i , j =1, *inicios ; for(i=0;i<len_cadena;i++) { if(cadena[i]==separador) { num_palabras++; } } inicios =malloc(sizeof(int)*num_palabras ); inicios[0]=0; for(i=1;i<len_cadena;i++) { if(cadena[i]==separador) { inicios[j]=i+1; j++; } } char **retorno =malloc(sizeof(char *)*num_palabras +1); retorno[num_palabras]=NULL; for(i=0;i<num_palabras;i++) { j=len_palabra(cadena, inicios[i], separador); retorno [i ]=(char *)malloc(sizeof(char)*j ); strncpy(retorno [i ], &cadena [inicios [i ]], j ); retorno[i][j]='\0'; } return retorno; }
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
|
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
Mensajes: 150
|
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
|
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
Mensajes: 373
|
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
Mensajes: 1.639
|
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': strncpy(retorno [i ], &cadena [inicios [i ]], j ); retorno[i][j] = '\0';
Puedes realizar los dos pasos con sprintf: 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: int len_palabra(char *cadena, int inicio, char separador) { int i = inicio; while (cadena[i] != separador && cadena[i] != '\0') i++; return i - inicio; }
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
Mensajes: 150
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[batch] funcion split
Scripting
|
z_ane_666
|
1
|
2,680
|
3 Enero 2011, 20:55 pm
por xassiz~
|
|
|
[C]Función SPLIT
Programación C/C++
|
Binary_Death
|
7
|
4,927
|
4 Octubre 2011, 17:19 pm
por Binary_Death
|
|
|
Función Split VB.NET
.NET (C#, VB.NET, ASP)
|
R3Z
|
7
|
6,555
|
4 Noviembre 2015, 05:03 am
por R3Z
|
|
|
Consulta: Función Split
Programación Visual Basic
|
jack06
|
4
|
3,016
|
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,264
|
27 Noviembre 2019, 16:58 pm
por Serapis
|
|