Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



miércoles, 1 de febrero de 2012

c++: Funcion Split sobre cadenas, usando la clase vector, strtok

Aquí os dejo varias formas de hacer la función split (partir una cadena en varias separadas por un carácter espacio " ").
He realizado tres funciones:

1) vector<string> splitCadena(string cadena) -> esta recibe una clase cadena
2) vector<string> splitCaracteres(char * caracteres) -> esta recibe un array de caracteres.
Las dos devuelven vectores tipo string.
 
3) int tamano(vector<string> myvector) -> devuelve un entero indicando el numero de cadenas que contiene (tamaño del vector)



Código fuente:


#include <iostream>
#include <vector>
#include <string>
#include <stdio.h
#include <string.h>

using namespace std;

//funcion que nos dice que tamaño tiene un vector.
int tamano(vector<string> myvector);
vector<string> splitCadena(string cadena);
vector<string> splitCaracteres(char * caracteres);

vector<string> splitCadena(string cadena){
vector<string> myvector(1);
char *ptr;
int a=1;
char linea[1000];
char * cstr;
cstr = new char [cadena.size()+1];
strcpy(cstr, cadena.c_str());

// empiezo a partir...
ptr=strtok(cstr," ");

strcpy(linea, ptr);
string cadenita (linea);
myvector[0] =cadenita;


while( (ptr = strtok( NULL, " " )) != NULL ) //Posteriores llamadas
{
myvector.resize(a+1);
strcpy(linea, ptr);
string cadenita (linea); // cadenita: es una cadena temporal que me sirve para parar los caracteres a una cadena
myvector[a]=cadenita; // se la asigno al vector
a++;
}
return myvector;
}



vector<string> splitCaracteres(char * caracteres){
vector<string> myvector(1);
char *ptr;
int a=1;
char linea[1000] ;// definimos una cadena de caracteres de 1000
// empiezo a partir...
//char* s1="holita";
ptr=strtok(caracteres," ");
strcpy(linea, ptr);
string cadenita (linea);
myvector[0] =cadenita;

while( (ptr = strtok( NULL, " " )) != NULL ) //Posteriores llamadas
{
myvector.resize(a+1);
strcpy(linea, ptr);
string cadenita (linea); // cadenita: es una cadena temporal que me sirve para parar los caracteres a una cadena
myvector[a]=cadenita; // se la asigno al vector
a++;
}

return myvector;
}

int main ()
{
//haciendo split a un array de caracteres y a una cadena de caracteres
cout << "-----------Sin usar la funcion split ...--------" << endl;
char *ptr;
int a=1;
char linea[1000];
char s1[1000]="Esto es una linea de caracteres";
vector<string> myvector (1);

//empiezo a partir....
ptr = strtok( s1, " " );
strcpy(linea, ptr);
// 1º elemento...
string cadenita (linea);
myvector[0] =cadenita;
//partir recursivamente...
while( (ptr = strtok( NULL, " " )) != NULL ) // Posteriores llamadas
{
// redimensiono....
myvector.resize(a+1);
// copio nuevo array de caracteres
strcpy(linea, ptr);
// los convierto en una cadena
string cadenita (linea);
//defino el nuevo vector, con esa cadena creada
myvector[a]=cadenita;
//aumento el contandor
a++;
}

//veo cual es el tamaño del vector creado
unsigned int i; //importante definirla asi, para que no de problemas en el for con sz
vector<int>::size_type sz = myvector.size();


cout << "myvector contiene:" << endl;
for (i=0; i<sz; i++)
cout << i<< ": " << myvector[i] << endl;


cout <<"--------------Usando funcion split en un char[]--------------------------------"<<endl;
vector<string> prueba(0);
char s2[]="Usando split en un char []";

//uso la funcion...
prueba=splitCaracteres(s2);
int sz2;
//uso funcion para saber el tamaño del vector
sz2=tamano(prueba);
cout << "Cadena a char[].... " << endl;

for (int i=0;i<sz2;i++)
cout << "vector string: " << i << ": " << prueba[i] << endl;

cout <<"----------------Split con una cadena -----------"<<endl;
vector<string> pruebaCadena(0);
string scadena="Usando Split en una cadena string";
cout << "Cadena a analizar: " << scadena << endl;
pruebaCadena=splitCadena(scadena);
int sz3;

//uso funcion para saber el tamaño del vector
sz3=tamano(pruebaCadena);

for (int i=0;i<sz3;i++)
cout << "vector string: " << i << ": " << pruebaCadena[i] << endl;

// system ("PAUSE"); usado en windows, para parar la pantalla de la consola
// return EXIT_SUCCESS;
return 0;
}


// determina el tamaño del vector..
int tamano(vector<string> myvector){
vector<int>::size_type sz2 = myvector.size();
return sz2 ;
}



Nota:
 1) Windows a Linux Problemas con el juego de caracteres....
Este programa lo realice con DEV-C++ en windows XP.
El archivo lo abrí luego en linux, con el gedit,  lo guarde como... con el juego de caracteres UTF8, para luego abrirlo con el codelite.

2)Usar el método push_back en vez de  .resize
En vez de:
// redimensiono....
myvector.resize(a+1); //(linea a)
// copio nuevo array de caracteres
strcpy(linea, ptr);
// los convierto en una cadena
string cadenita (linea);
//defino el nuevo vector, con esa cadena creada
myvector[a]=cadenita; //(linea b)

Podemos hacer sustituir las lineas a y b por :
myvector.push_back(cadenita);