Página 1 de 1

[Funcion] SplitMetal C++

Publicado: 06 Sep 2015, 04:33
por crack81
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;
}

Re: [Funcion] SplitMetal C++

Publicado: 06 Sep 2015, 06:13
por Pink
"Hola mundo soy el es stub" lol de mas algo por ahí.

Excelente bro.

Saludos

Re: [Funcion] SplitMetal C++

Publicado: 06 Sep 2015, 15:29
por crack81
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;
}

Re: [Funcion] SplitMetal C++

Publicado: 06 Sep 2015, 23:30
por Pink
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

Re: [Funcion] SplitMetal C++

Publicado: 07 Sep 2015, 03:24
por crack81
Genial pink tu nunca dejas de hacer buenos aportes

Saludos...