• [Funcion] SplitMetal C++

 #477433  por crack81
 06 Sep 2015, 04:33
Estaba viendo unos sources y me tope con el split que hizo Metalkingdom para su tutorial del crypter hecho en Delphi, la verdad me gusto por lo practico y facil de entender asi que lo pase a c++ para aquellos que hacen crypters en c++
#include <iostream>
using namespace std;


typedef struct TCrypterData{
  string Data[3];
}TSarray;

TSarray splitMetal(const string Texto,const string Delimitador){

   int o=0,posDel=0;
   TSarray arreglo;
   string aux=Texto;

   do{
     posDel=aux.find(Delimitador);
     if(posDel==-1){
        arreglo.Data[o]=aux;
        break;
     }

     arreglo.Data[o]=aux.substr(0,posDel);
     aux.erase(0,posDel+Delimitador.length());
     o++;
   }while(aux!="");

  return arreglo;
}



int main()
{
    string cadena="Hola mundo soy el es stub delimitador key delimitador el archivo cifrado";
    TSarray datos=splitMetal(cadena,"delimitador");
    cout<<datos.Data[0]<<endl;//nos regresa===> Hola mundo soy el es stub
    cout<<datos.Data[1]<<endl;//nos regresa===> key
    cout<<datos.Data[2]<<endl;// nos regresa==> delimitador el archivo cifrado
    cin.get();
    return 0;
}
 #477436  por Pink
 06 Sep 2015, 06:13
"Hola mundo soy el es stub" lol de mas algo por ahí.

Excelente bro.

Saludos
 #477462  por crack81
 06 Sep 2015, 15:29
Revisando el cogido me di cuenta que este split solo puede separar un maximo de 3 partes, para un crypter esta bien pero si por alguna razon se necesita algo mas generico y uno quisiera separa la cadena en tantos delimitadores que haya ya no seria posible, a eso le sumamos que muchos no se siente comodos con el struct.

Asi que dejo esta version retocada que permite cortar tantas veces como haya de delimitadores, ademas retorna un vector<string> el cual puede resultar mas comodo y posee un serie de funcionalidades que ayudan como el metodo size que nos dice en cuantas parte ha cortado la cadena y mucho mas.
#include <iostream>
#include<vector>
using namespace std;

vector<string> splitMetal(const string Texto,const string Delimitador){

   int o=0,posDel=0;
   vector<string> arreglo;
   string aux=Texto;

   do{
     posDel=aux.find(Delimitador);
     if(posDel==-1){
        arreglo.push_back(aux);
        break;
     }

     arreglo.push_back(aux.substr(0,posDel));
     aux.erase(0,posDel+Delimitador.length());
     o++;
   }while(aux!="");

  return arreglo;
}

int main()
{
    string cadena=" Parte 1 delimitador Parte 2 delimitador Parte 3 delimitador Parte 4";
    vector<string>datos=splitMetal(cadena,"delimitador");
    cout<<datos[0]<<endl;//nos regresa==> Parte 1
    cout<<datos[1]<<endl;//nos regresa==> Parte 2
    cout<<datos[2]<<endl;//nos regresa==> Parte  3
    cout<<datos[3]<<endl;//nos regresa==> Parte  4
    return 0;
}
 #477492  por Pink
 06 Sep 2015, 23:30
Exelente Crack. ahí dejo una versión que hice para pasar el tiempo.
#include <iostream>
#include <vector>

using namespace std;

vector<string> aSplit(const string str,const string delimiter)
{
    vector<string> astring;
    unsigned int endpos=0;
    string s=str;

    while (1)
    {
    if ((endpos=s.find(delimiter))!=string::npos)
        {
            astring.push_back(s.substr(0,endpos));
            s=s.substr(endpos+delimiter.size(),s.size()-endpos);
        }
        else{ if(s.size()>0 && s.size()!=str.size()){astring.push_back(s);}break;
        }
    }
    return astring;
}

int main()
{
    string cadena=" Parte 1 delimitador Parte 2 delimitador Parte 3 delimitador Parte 4delimitador";
    vector<string>datos=aSplit(cadena,"delimitador");
    if (datos.size()) {
    cout<<datos[0]<<endl;//nos regresa==> Parte 1
    cout<<datos[1]<<endl;//nos regresa==> Parte 2
    cout<<datos[2]<<endl;//nos regresa==> Parte 3
    cout<<datos[3]<<endl;//nos regresa==> Parte 4

    }
    return 0;
}
Saludos