.
....Se me bloqueo mi otro post... asi que aquí lo dejo.

....He notado a miuchos que quieres reahacer la funcion Split en C y la verdad no me gusta su metodo asi que dejo una funcion Split de mi tutela.

....Su uso es muy facil, y TODAS las funciones entan en ANSI C en el proceso salto el proceso main() por el uso de cout , cin.get(), bueno en fin C++ por que se me hace mas facil para mi a la hora de mostrar algo sin romperme el orto.

Código: Seleccionar todo


#include<iostream>
#include<stdlib.h>

using namespace std;

unsigned int rectific_num(unsigned int vval,unsigned int vmin,unsigned int vmax);
bool fix_numbers_range(unsigned int* vIndexIni,unsigned int* vIndexEnd, unsigned int* vLen, unsigned int* vDistanceInOut, unsigned int vMin, unsigned int vMax);
unsigned long strlen(char* string);
unsigned long instr(unsigned long start,char* string1,char* string2);
char* mid(char* str, unsigned int start, unsigned int len);
char* strcpy(char* str_dest,char* str_src);
int* split(char* str, char* delimiter, long* limit);

int main()
{
    long lim=-1,i=0;
    int *v = split((char*)"hola.mundo.adios",(char*)".",&lim);  // limite de -1 para que nos cree todos los posibles.
    cout << lim << endl;
    for (i = 0;i<=lim && v!=0;i++)
        if ( v[i] != 0 )        //  No es nesesario verificar xP
            cout << "-->" << (char*)v[i] << "<--" << endl;
    cout << "Eliminando memoria Dinamica" << endl;
    //  Se debe descargar o eliminar la memoria creada s ela siguiente manera
    if ( v != 0 )
    {
        for ( i = 0 ; i<=lim && v!=0 ;i++)
            if ( v[i] != 0 )        //
                free((char*)v[i]); //  Elimina las cadenas.
        free(v);       //  Elimina la coleccion o Array madre.
        cout << "limpiesa completada" << endl;
    } else {
        cout << "no existe el array" << endl;
    }
    //
    cout << "Pulse {Enter} para continuar" << endl;
    cin.get();
    return 1;
}

//Esta funcion quedaria muchisimo mejor con una plantilla en C++
unsigned int rectific_num(unsigned int vval,unsigned int vmin,unsigned int vmax)
/*
    Esta funcion esta extraida y traducida desde mi ListViewEx ( vb6 ) se puede descargar desde mi pagina
    By BlackZeroX http://infrangelux.sytes.net/
*/
{
    if (vval < vmin)
        return vmin;
    else if ( vval > vmax )
        return vmax;
    else
        return vval;
}

//Esta funcion quedaria muchisimo mejor con una plantilla en C++
bool fix_numbers_range(unsigned int* vIndexIni,unsigned int* vIndexEnd, unsigned int* vLen, unsigned int* vDistanceInOut, unsigned int vMin, unsigned int vMax)
/*
    Esta funcion esta extraida y traducida desde mi ListViewEx ( vb6 ) se puede descargar desde mi pagina
    By BlackZeroX http://infrangelux.sytes.net/
*/
{
    if ( vMax >= *vIndexIni && *vLen != 0 )
    {
        *vIndexIni = rectific_num(*vIndexIni,vMin,vMax);
        *vIndexEnd = rectific_num(*vIndexIni + --*vLen,*vIndexIni,vMax);
        if ( vDistanceInOut )
            *vDistanceInOut = rectific_num(*vDistanceInOut,vMin,vMax - *vIndexEnd);
        *vLen= *vIndexEnd - *vIndexIni+1;
        if ( *vLen > 0 )
            return true;
        else
            return false;
    } else {
        return false;
    }
}

unsigned long strlen(char* string)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    unsigned long i=0;
    while (*(string++) != '\0') i++;
    return i;
}

char* strcpy(char* str_dest,char* str_src)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    while( (*(str_dest++)=*(str_src++) == '\0' ) );
    return (str_dest);
}

unsigned long instr(unsigned long start,char* string1,char* string2)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    unsigned long  q,c,limit;
    q=c=limit=0;
    long ls2len=0;

    ls2len = strlen(string2) - 1;

    if ( ls2len >= 0 )
    {
        limit = strlen(string1)-ls2len;

        if ( limit > 1 )
        {
            q = start-1;
            while ( q < limit )
            {
                while ( string1[q+c] == string2[c] )
                    if ( (c++) == (unsigned long)ls2len )
                        return q+1;
                q+=c+1;
                c=0;
            }
        }
    } else if (*string1 > '\0') {
        return 1;
    }
    return 0;
}
char* mid(char* str, unsigned int start, unsigned int len)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    char* pch_t;
    unsigned int ul_str=strlen(str);
    unsigned int ul_end=start+len;
    start--;len++;
    if ( fix_numbers_range(&start,&ul_end,&len,0,0,ul_str) )
    {
        if ( (pch_t = (char*)malloc(sizeof(char)*--len)) != 0 )
        {
            for (ul_str=0;start <= ul_end;start++,ul_str++ )
                pch_t[ul_str] = str[start];
            pch_t[len]='\0';
            return pch_t;
        } else {
            return 0;
        }
    } else {
        return 0;
    }
}

int* split(char* str, char* delimiter, long* limit)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    unsigned int ui_lp  =1;
    unsigned int ui_inc =1;
    unsigned int ui_lns =0;
    unsigned int ui_del =0;
    unsigned long ui_ub =0;
    int *pi_out;

    if ( *limit > 0 || *limit == -1 )
    {
        if ( strlen(delimiter) == 0 )
            delimiter = (char*)" ";
        if ( !(str[0] == '\0' || instr( 1 , str , delimiter ) == 0) )
        {
            ui_lns = strlen(str);
            ui_del = strlen(delimiter);
            pi_out = (int*)realloc(0,sizeof(int));
            for(;pi_out!=0;)
            {
                if ( ui_ub+1 == *limit )
                {
                    pi_out[ui_ub] = (int)mid(str, ui_lp,ui_lns+1);
                    break;
                }
                ui_inc = instr(ui_inc, str, delimiter);
                if ( ui_inc == 0 )
                {
                    if ( ui_lp != ui_lns )
                        pi_out[ui_ub] = (int)mid(str, ui_lp,ui_lns);
                    break;
                }
                pi_out[ui_ub++] = (int)mid(str, ui_lp, ui_inc - ui_lp);
                pi_out = (int*)realloc(pi_out,(sizeof(int)*(ui_ub+1)));
                ui_lp = ui_inc + ui_del;
                ui_inc = ui_lp;
            }
            *limit = ui_ub;
            return pi_out;
        }
    }
    return 0;
    *limit=-1;
}

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
Bastante interesante el split, no lo he compilado ni mirado a fondo pero bueno en las últimas lineas:

return 0;
*limit=-1;

Nada se ejecuta despues del return jeje así que el modo correcto sería

*limit=-1;
return 0;

O si no sirve el puntero que marcas solo sacarlo de ahí jeje saludos, bonita función split, me tocará ami hacer una también :P
//mHmm..
.
@linkgl

Un dato: NO me lo tienes que explicar solo hacerlo notar.

* Error de un servidor ( estube compactando el codigo y nunca vi eso jojojo!¡. ), jajaja pero aun asi comprovando el puntero se sabe y *limit esta de mas si el retorno es Null o 0 en dicha funcion.

Código: Seleccionar todo

si no sirve el puntero que marcas solo sacarlo de ahí
Un puntero JAMAS es 0 por ende estara correcto retornar 0.

P.D.: Me falta depurarun poco el codigo, ya detecte unos errores ( siempre me apresuro a publicar jom ).

Dulces Lunas!¡.
Última edición por BlackZeroX el 12 Ene 2011, 03:09, editado 2 veces en total.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
LIndos codigos , me gustan estas adaptaciones , te dejo mi version de la funcion "pos" en delphi...

Código: Seleccionar todo

int _pos(char* string ,char del)
{
  char *ps = string;
  int i;

  for(i=0;i<= sizeof(ps);ps++,i++)
   {    
     if( *ps == del) 
        return i;
   }
 return -1;
}
y Una funcion similar al sRigh de linkgl , usando punteros.....

Código: Seleccionar todo

char *StringRight(char *sCadena,int iPosicion)
{
  char *p = &sCadena[iPosicion-1];

 if(*p != '\0')
  return p;
 else
  return '\0';
}

Son sumamente simples , pero de seguiro a alguien le sirve....
obey escribió:Pues si tuviese mas edad todavia pero esqe perder la virginidad con tu profesora de informatica y que ademas tenga 50....
Tu funcion _pos en lo particular no sirve para este caso, revisa y veras, y la funcion StringRight esta bien pero apunta a la misma cadena de origen a donde se buscaria, seria agradable meterle malloc+memcpy dentro y devolver el nuevo puntero.

Hasta donde yo se sizeof solo trabaja en tiempo de compilacion. y si no es que entonces me mintio el administrador de este [Enlace externo eliminado para invitados], que son mas serios y confiables en estos temas.

Dulces Lunas!¡.
Última edición por BlackZeroX el 12 Ene 2011, 03:10, editado 1 vez en total.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
@BlackZeroX jeje bueno sé que tu no necesitas la explicación pero muchos otros incluyendome a mí en varios casos la necesito :P no todos somos expertos estudiantes universitarios como vos, y la otra parte NO dije que retornaras el puntero... retornar la función a 0 es correcto pero el *limit no es necesario resetearlo a -1 si ya no lo vas a retornar ni utilizar, de igual manera si lo quieres hacer es tu desición pero va arriba del return jeje jamás dije que lo retornaras ni que valiera 0 :P saludos brother!
//mHmm..
linkgl escribió:@BlackZeroX jeje bueno sé que tu no necesitas la explicación pero muchos otros incluyendome a mí en varios casos la necesito :P no todos somos expertos estudiantes universitarios como vos,
Esta fuera de lugar el comentario, parece mas un ataque de eres un "SabeloTodo".
BlackZeroX escribió:.
@linkgl

Un dato: NO me lo tienes que explicar solo hacerlo notar.

* Error de un servidor ( estube compactando el codigo y nunca vi eso jojojo!¡. ), jajaja pero aun asi comprovando el puntero se sabe y *limit esta de mas si el retorno es Null o 0 en dicha funcion.
Lo de hacerlo notar No es para que "te pusieras el saco del Yo lo se y te lo explicare.", en otras palabras con un te equivocaste, citar dichas lineas o que se yo, pero que sea una llamada de atencion/resalte/algo humilde.

P.D.: lo malo de el texto es que no se entiende la idea principal y mucho menos si no se lee como se deveria, "estando en el pellejo del escritor".

Dulces Lunas!¡.
-
Última edición por BlackZeroX el 12 Ene 2011, 03:28, editado 2 veces en total.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
No lo he dicho presumiendo que sé o no sé ;) solo quize explicar el porqué igual nada de lo que digo es faltando al respeto y para que alguien que lea el tema se entere de qué sucede, porqué sucede y cómo se corrije y todos aprendemos algo pero bueno si te parece que se me sube o algo pues no bro lo hago en buen plan igual pero lo haré como dices en tus posts para evitar mal entendidos que suele haber muchos cuando se escribe y no se esta físicamente presente ;) saludos bro
//mHmm..
para mi que no saben nada yo no entendi una mierda.
Asi que por las dudas digo no saben nadaaaa
saludos y fuera de broma ,gracias.
Siempre por aqui
BlackZeroX escribió:Tu funcion _pos en lo particular no sirve para este caso, revisa y veras, y la funcion StringRight esta bien pero apunta a la misma cadena de origen a donde se buscaria, seria agradable meterle malloc+memcpy dentro y devolver el nuevo puntero.

Hasta donde yo se sizeof solo trabaja en tiempo de compilacion. y si no es que entonces me mintio el administrador de este subForo, que son mas serios y confiables en estos temas.

Dulces Lunas!¡.
Ya se lo de lafuncion 'pos' solo puede usar un caracter como delimitador en este caso no servira de mucho , pero es
algo..... En cuanto a al segunda funcion , podrias tener erazon , pero por lo menos en mi caso con sizeof funciona
bien.....

Saludos
obey escribió:Pues si tuviese mas edad todavia pero esqe perder la virginidad con tu profesora de informatica y que ademas tenga 50....
Responder

Volver a “Fuentes”