....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;
}