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

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


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

Desconectado Desconectado

Mensajes: 214



Ver Perfil
[C]Función SPLIT
« en: 29 Junio 2011, 19:57 pm »

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:

Código
  1. /* char **split(char *string, char *sep);
  2.    Coded by Binary_Death on 30/6/2011
  3. */
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. char **split(char*,char*);
  7. int _strlen(char*);
  8. int _cmp(char*,char*,int);
  9. int main() {
  10.    char **array = split("STRING1#DLM#STRING2#DLM#STRING3","#DLM#");
  11.    for(int y=0;y<3;y++) printf("%s\n", array[y]);
  12.    getchar();
  13.    return 0;
  14. }
  15. char **split(char *string,char *sep) {
  16.     int str_len=_strlen(string);
  17.     int sep_len=_strlen(sep);
  18.     int ptr_block=0, chr=0, bool_end=0;
  19.     char **buffer = (char**)malloc(sizeof(char*));
  20.     *buffer = (char*)malloc(sizeof(char*));**buffer=0;
  21.     char *tok = (char*)malloc(sep_len*sizeof(char));
  22.     for(int z=0;z<str_len;z++) {
  23.             for(int n=0;n<sep_len&&!bool_end;n++)
  24.             {(str_len-(z+1)>=sep_len)?tok[n]=string[z+n]:bool_end=1;}
  25.             if(_cmp(tok,sep,sep_len)||bool_end) {
  26.                                  buffer[ptr_block][chr++] = string[z];
  27.                                  buffer[ptr_block] = (char*)realloc(buffer[ptr_block],chr*sizeof(char*));
  28.                                  buffer[ptr_block][chr] = 0;
  29.                                   } else {
  30.                                          buffer = (char**)realloc(buffer,(++ptr_block+1)*sizeof(char*));
  31.                                          buffer[ptr_block] = (char*)malloc(sizeof(char*));
  32.                                          chr=0;z+=sep_len-1;
  33.                                   }                          
  34.    }
  35. free(tok);
  36. return buffer;
  37. }
  38. int _strlen(char *pstr) {
  39.    int i=0;
  40.    while(*(pstr++)!='\0') i++;
  41.    return i;
  42. }
  43. int _cmp(char *fstr,char *sstr, int len) {
  44.    int bytes=0;
  45.    while(bytes++<len) if(*(fstr++)!=*(sstr++)) return 1;
  46.    return 0;
  47. }
  48.  

Agradecería que se me reportaran los errores y así mejorar  :P

Saludos!

EDITO: Ya esta arreglado! Igual seguro que tiene muchos errores más, ya se irán arreglando, yo soy paciente  ;D

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 Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [C]Función SPLIT
« Respuesta #1 en: 29 Junio 2011, 21:12 pm »

.
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 Desconectado

Mensajes: 214



Ver Perfil
Re: [C]Función SPLIT
« Respuesta #2 en: 29 Junio 2011, 21:25 pm »

Recién ahora me di cuenta de un error que no sé de donde viene... ando ahí intentando descubrir  :silbar:

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  :P


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 Desconectado

Mensajes: 214



Ver Perfil
Re: [C]Función SPLIT
« Respuesta #3 en: 30 Junio 2011, 06:23 am »

Aquí dejo la versión casi completa, hasta reporte de nuevos fallos.

Código
  1. /* char **split(char *string, char *sep);
  2.    Coded by Binary_Death on 30/6/2011
  3. */
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. typedef struct {
  7.        char **substring_ptr;
  8.        int number_of_substrings;
  9. } split_struct;
  10. split_struct* split(char*,char*);
  11. int _strlen(char*);
  12. int _cmp(char*,char*,int);
  13. int main() {
  14.    split_struct *str;
  15.    str = split("STRING1#DLM#STRING2#DLM#STRING3","#DLM#");
  16.    for(int y=0;y<str->number_of_substrings;y++)
  17.    {printf("%s\n", str->substring_ptr[y]);}
  18.    getchar();
  19.    return 0;
  20. }
  21. split_struct *split(char *string,char *sep) {
  22.     split_struct *retvalue;
  23.     retvalue = (split_struct*)malloc(sizeof(split_struct));
  24.     int str_len=_strlen(string);
  25.     int sep_len=_strlen(sep);
  26.     int ptr_block=0, chr=0, bool_end=0;
  27.     char **buffer = (char**)malloc(sizeof(char*));
  28.     *buffer = (char*)malloc(sizeof(char*));**buffer=0;
  29.     char *tok = (char*)malloc(sep_len*sizeof(char));
  30.     for(int z=0;z<str_len;z++) {
  31.             for(int n=0;n<sep_len&&!bool_end;n++)
  32.             tok[n]=(z+n<str_len)?string[z+n]:bool_end=1;
  33.             if(_cmp(tok,sep,sep_len)||bool_end) {
  34.                                  buffer[ptr_block][chr++] = string[z];
  35.                                  buffer[ptr_block] = (char*)realloc(buffer[ptr_block],chr*sizeof(char*));
  36.                                  buffer[ptr_block][chr] = 0;
  37.                                   } else {
  38.                                          buffer = (char**)realloc(buffer,(++ptr_block+1)*sizeof(char*));
  39.                                          buffer[ptr_block] = (char*)malloc(sizeof(char*));**(buffer+ptr_block)=0;
  40.                                          chr=0;z+=sep_len-1;
  41.                                   }                          
  42.    }
  43. free(tok);
  44. retvalue->substring_ptr = buffer;
  45. retvalue->number_of_substrings = ptr_block+1;
  46. return retvalue;
  47. }
  48. int _strlen(char *pstr) {
  49.    int i=0;
  50.    while(*(pstr++)!='\0') i++;
  51.    return i;
  52. }
  53. int _cmp(char *fstr,char *sstr, int len) {
  54.    int bytes=0;
  55.    while(bytes++<len) if(*(fstr++)!=*(sstr++)) return 1;
  56.    return 0;
  57. }
  58.  

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 Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: [C]Función SPLIT
« Respuesta #4 en: 7 Julio 2011, 07:00 am »

.
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 Desconectado

Mensajes: 1.639


Ver Perfil
Re: [C]Función SPLIT
« Respuesta #5 en: 9 Julio 2011, 01:48 am »

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:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char **split(char const *linea, char const *sep);
  6.  
  7. int main(void)
  8. {
  9.   char **p;
  10.   char **q;
  11.  
  12.   p = split("STRING1#DLM#STRING2#DLM#STRING3", "#DLM#");
  13.  
  14.   for (q = p; *q != NULL; q++){
  15.      puts(*q);
  16.      free(*q);
  17.   }
  18.   free(p);
  19.  
  20.   return EXIT_SUCCESS;
  21. }
  22.  
  23. char **split(char const *linea, char const *sep)
  24. {
  25.   char **p;
  26.   char const *a;
  27.   char const *b;
  28.   int i;
  29.  
  30.   p = malloc((strlen(linea) / 2 + 2) * sizeof *p);
  31.  
  32.   i = 0;
  33.   a = linea;
  34.   while ((b = strstr(a, sep)) != NULL){
  35.      if (b != a){
  36.         p[i] = malloc(b - a + 1);
  37.         strncpy(p[i], a, b - a);
  38.         i++;
  39.      }
  40.  
  41.      a = b + strlen(sep);
  42.   }
  43.   if (*a != '\0'){
  44.      p[i] = malloc(strlen(a) + 1);
  45.      strcpy(p[i], a);
  46.      i++;
  47.   }
  48.   p[i++] = NULL;
  49.  
  50.   p = realloc(p, i * sizeof *p);
  51.   return p;
  52. }

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 Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
Re: [C]Función SPLIT
« Respuesta #6 en: 9 Julio 2011, 11:26 am »

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 Desconectado

Mensajes: 214



Ver Perfil
Re: [C]Función SPLIT
« Respuesta #7 en: 4 Octubre 2011, 17:19 pm »


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  ;D 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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda o Problema con la funcion Split
Programación Visual Basic
Angeldj27 6 2,764 Último mensaje 25 Abril 2009, 15:41 pm
por Angeldj27
[batch] funcion split
Scripting
z_ane_666 1 2,531 Último mensaje 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,468 Último mensaje 24 Octubre 2011, 20:25 pm
por xivan25
Puedo ofuscar esta la funcion Split asi???
Programación Visual Basic
xivan25 4 2,418 Último mensaje 28 Octubre 2011, 04:06 am
por Elemental Code
[C] Funcion Split
Programación C/C++
mr.blood 6 3,626 Último mensaje 29 Marzo 2013, 10:43 am
por mr.blood
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines