Autor
|
Tema: [C]Función SPLIT (Leído 4,927 veces)
|
Binary_Death
Desconectado
Mensajes: 214
|
He hecho esta típica función en C... Es digamos la primera versión así que debe de tener muchos errores, de hecho hasta me atrevería a decir que es cutre, pero en fin, aquí os la dejo: /* char **split(char *string, char *sep); Coded by Binary_Death on 30/6/2011 */ #include <stdlib.h> #include <stdio.h> char **split(char*,char*); int _strlen(char*); int _cmp(char*,char*,int); int main() { char **array = split("STRING1#DLM#STRING2#DLM#STRING3","#DLM#"); for(int y =0;y <3;y ++) printf("%s\n", array [y ]); return 0; } char **split(char *string,char *sep) { int str_len=_strlen(string); int sep_len=_strlen(sep); int ptr_block=0, chr=0, bool_end=0; char **buffer = (char**)malloc(sizeof(char*)); *buffer = (char*)malloc(sizeof(char*));**buffer =0; char *tok = (char*)malloc(sep_len *sizeof(char)); for(int z=0;z<str_len;z++) { for(int n=0;n<sep_len&&!bool_end;n++) {(str_len-(z+1)>=sep_len)?tok[n]=string[z+n]:bool_end=1;} if(_cmp(tok,sep,sep_len)||bool_end) { buffer[ptr_block][chr++] = string[z]; buffer [ptr_block ] = (char*)realloc(buffer [ptr_block ],chr *sizeof(char*)); buffer[ptr_block][chr] = 0; } else { buffer = (char**)realloc(buffer ,(++ptr_block +1)*sizeof(char*)); buffer [ptr_block ] = (char*)malloc(sizeof(char*)); chr=0;z+=sep_len-1; } } return buffer; } int _strlen(char *pstr) { int i=0; while(*(pstr++)!='\0') i++; return i; } int _cmp(char *fstr,char *sstr, int len) { int bytes=0; while(bytes++<len) if(*(fstr++)!=*(sstr++)) return 1; return 0; }
Agradecería que se me reportaran los errores y así mejorar Saludos! EDITO: Ya esta arreglado! Igual seguro que tiene muchos errores más, ya se irán arreglando, yo soy paciente EDITO2: Segunda modificación, he reducido y optimizado muchísimo el código.
|
|
« Última modificación: 30 Junio 2011, 02:35 am por Binary_Death »
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
. Lamento responder tan tarde. Con respecto a los '\0' con bytes 0 esta clase SI los toma en cuenta. de hecho por eso la mejore ( relamente fue por que tenia que hacer un trabajo escolar donde tenia que tratar estos bytes y la verdad los strings se quedaban escasos ante esta problematica, ya que usan este '\0' como indicador de fin de cadena ). Aqui te dejo la liga de la clase... cls_Byte ( Funciones Binarias ) ByteReplace, ByteSplit, ByteMid, ByteExits...* Esta puede diferenciar mayusculas de minusculas segun se le indique... * Se le puede limitar en la Cantidad X a cortar. * Toma enconsideracion TODOS los bytes dentro de un Rango dado ( segun la longitud ) es decir que tengan lo que tengan lo Tomara en cuenta HASTA EL FINAL. Dulces Lunas!¡. .
|
|
« Última modificación: 7 Julio 2011, 06:59 am por BlackZeroX▓▓▒▒░░ »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
Binary_Death
Desconectado
Mensajes: 214
|
Recién ahora me di cuenta de un error que no sé de donde viene... ando ahí intentando descubrir Si intento con una cadena como: "String1SEPAString1","SEPA" Curiosamente, al imprimir array[1] sólo me muestra String, en vez de String1. Y por cada carácter que aumento en el separador, un carácter menos que muestra de la String... Gracias por los links, les echaré una leída EDIT: Ya le vi el error... miraré la mejor forma de corregirlo y lo edito en el primer post. Una pregunta, BlackZeroX, ¿tú función es capaz de interpretar cadenas con un carácter nulo '\0' en medio? Es que sería necesario si se usa la función con ficheros binarios, y no sé como hacer que eso sea posible.
|
|
« Última modificación: 29 Junio 2011, 21:44 pm por Binary_Death »
|
En línea
|
|
|
|
Binary_Death
Desconectado
Mensajes: 214
|
Aquí dejo la versión casi completa, hasta reporte de nuevos fallos. /* char **split(char *string, char *sep); Coded by Binary_Death on 30/6/2011 */ #include <stdlib.h> #include <stdio.h> typedef struct { char **substring_ptr; int number_of_substrings; } split_struct; split_struct* split(char*,char*); int _strlen(char*); int _cmp(char*,char*,int); int main() { split_struct *str; str = split("STRING1#DLM#STRING2#DLM#STRING3","#DLM#"); for(int y=0;y<str->number_of_substrings;y++) {printf("%s\n", str ->substring_ptr [y ]);} return 0; } split_struct *split(char *string,char *sep) { split_struct *retvalue; retvalue = (split_struct *)malloc(sizeof(split_struct )); int str_len=_strlen(string); int sep_len=_strlen(sep); int ptr_block=0, chr=0, bool_end=0; char **buffer = (char**)malloc(sizeof(char*)); *buffer = (char*)malloc(sizeof(char*));**buffer =0; char *tok = (char*)malloc(sep_len *sizeof(char)); for(int z=0;z<str_len;z++) { for(int n=0;n<sep_len&&!bool_end;n++) tok[n]=(z+n<str_len)?string[z+n]:bool_end=1; if(_cmp(tok,sep,sep_len)||bool_end) { buffer[ptr_block][chr++] = string[z]; buffer [ptr_block ] = (char*)realloc(buffer [ptr_block ],chr *sizeof(char*)); buffer[ptr_block][chr] = 0; } else { buffer = (char**)realloc(buffer ,(++ptr_block +1)*sizeof(char*)); buffer [ptr_block ] = (char*)malloc(sizeof(char*));**(buffer +ptr_block )=0; chr=0;z+=sep_len-1; } } retvalue->substring_ptr = buffer; retvalue->number_of_substrings = ptr_block+1; return retvalue; } int _strlen(char *pstr) { int i=0; while(*(pstr++)!='\0') i++; return i; } int _cmp(char *fstr,char *sstr, int len) { int bytes=0; while(bytes++<len) if(*(fstr++)!=*(sstr++)) return 1; return 0; }
Esta vez devuelve un puntero a una estructura que contiene el array de cadenas y el número de cadenas obtenidas. Saludos!
|
|
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
. Lamento responder tan tarde. Con respecto a los '\0' con bytes 0 esta clase SI los toma en cuenta. de hecho por eso la mejore ( relamente fue por que tenia que hacer un trabajo escolar donde tenia que tratar estos bytes y la verdad los strings se quedaban escasos ante esta problematica, ya que usan este '\0' como indicador de fin de cadena ). Aqui te dejo la liga de la clase... cls_Byte ( Funciones Binarias ) ByteReplace, ByteSplit, ByteMid, ByteExits...* Esta puede diferenciar mayusculas de minusculas segun se le indique... * Se le puede limitar en la Cantidad X a cortar. * Toma enconsideracion TODOS los bytes dentro de un Rango dado ( segun la longitud ) es decir que tengan lo que tengan lo Tomara en cuenta HASTA EL FINAL. Dulces Lunas!¡. .
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
La función "split" del programa de Binary_Death se puede mejorar. Se debería eliminar la llamada a "getchar" al final de la función "main" ya que la generación de una pausa de forma automática es problema del IDE, no del programa. Y ya que la función retorna una única estructura no es necesario reservar memoria para ella, puede declararse una dentro de la funcion y utilizarla como valor de retorno. También se pueden eliminar todas las conversiones explicitas ya que en C no son necesarias, "sizeof(char)" también hay que eliminarlo ya que este siempre es igual a uno. ---- Otra forma de realizar la operación utilizando la función strstr y aritmética de punteros es: #include <stdio.h> #include <stdlib.h> #include <string.h> char **split(char const *linea, char const *sep); int main(void) { char **p; char **q; p = split("STRING1#DLM#STRING2#DLM#STRING3", "#DLM#"); for (q = p; *q != NULL; q++){ } return EXIT_SUCCESS; } char **split(char const *linea, char const *sep) { char **p; char const *a; char const *b; int i; i = 0; a = linea; while ((b = strstr(a , sep )) != NULL ){ if (b != a){ i++; } } if (*a != '\0'){ i++; } p[i++] = NULL; return p; }
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
|
|
|
Khronos14
Desconectado
Mensajes: 443
A lie is a lie
|
Binary_Death, sólo una cosa: ver tu función split me dió un dolor de cabeza que no te lo puedes imaginar, de hecho pasé de mirarla.
Tienes que aprender a programar código ordenado y hacerlo agradable a la vista, no hay color entre tu función y la que puso rir3760.
Saludos.
|
|
|
En línea
|
|
|
|
Binary_Death
Desconectado
Mensajes: 214
|
Sí, verdaderamente es un lío esa función... tengo que hacer las cosas más agradables a la vista, aunque por costumbre tiendo a hacerlas así. Con strstr queda fácil pero pensé que la gracia era hacer una sin contar con ninguna función de string.h. Tal vez la rehaga y la vuelva a subir, esta vez mucho más legible. Un saludo, y muchas gracias por comentar. Nos vemos.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Duda o Problema con la funcion Split
Programación Visual Basic
|
Angeldj27
|
6
|
2,953
|
25 Abril 2009, 15:41 pm
por Angeldj27
|
|
|
[batch] funcion split
Scripting
|
z_ane_666
|
1
|
2,680
|
3 Enero 2011, 20:55 pm
por xassiz~
|
|
|
¿Ha la funcion Split en VB6 se puede cambiar por otra igual?
Programación Visual Basic
|
xivan25
|
4
|
3,627
|
24 Octubre 2011, 20:25 pm
por xivan25
|
|
|
Puedo ofuscar esta la funcion Split asi???
Programación Visual Basic
|
xivan25
|
4
|
2,574
|
28 Octubre 2011, 04:06 am
por Elemental Code
|
|
|
[C] Funcion Split
Programación C/C++
|
mr.blood
|
6
|
4,011
|
29 Marzo 2013, 10:43 am
por mr.blood
|
|