[C con Clase] Clase cadena

sebastianoldani sebastianoldani en gmail.com
Vie Oct 19 20:05:53 CEST 2007


Hola, siguiendo el manual y haciendo un "tributo" a borland empeze a 
escribir una clase que sea igual al AnsiString. Cree algunas funciones, 
la posteo por si alguien la quiere usar y ademas, por si alguien se copa 
y le agrega mas funciones y la postea para seguir mejorandola. Vi que 
muchos programan con compiladores gratis y estaria bueno tener alguna de 
estas cosas bien buenas. Espero que se copen y le agregen cosas y la 
corrigan. Algunas cosas las copie del manual porque la verdad que 
estaban mejores uqe las que se me ocurrian a mi. Nos vemos.
Sebastian Oldani.

class Cadena {
private:
        char *cadena;
public:
        Cadena(char *cad);
        Cadena():cadena(NULL){};
        int Pos(char *cad);
        int Length(void);
        Cadena Insert (char *cad,int indice);
        Cadena Delete (int indice,int cantidad);
        Cadena SubString(int indice,int cantidad);
        Cadena operator=(const Cadena &c);
        Cadena operator+(const Cadena &c);
        char* Str (void);
};
Cadena::Cadena(char *cad){
cadena = new char[strlen(cad)+1];
strcpy(cadena,cad);
}
Cadena Cadena::operator=(const Cadena &c){
if(this != &c){
delete[] cadena;
if(c.cadena){
cadena = new char [strlen(c.cadena)+1];
strcpy(cadena,c.cadena);
}
else cadena = NULL;
}
return *this;
}
Cadena Cadena::operator+(const Cadena &c){
Cadena temp;
if(cadena==NULL){
cadena = new char[1];
strcpy(cadena,"");
}
temp.cadena = new char[strlen(c.cadena)+strlen(cadena)+1];
strcpy(temp.cadena,cadena);
strcat(temp.cadena,c.cadena);
return temp;
}
int Cadena::Pos(char *cad){
unsigned int n=0,m=0;
if(cadena==NULL){
cadena = new char[1];
strcpy(cadena,"");
}
while((cad[n]!='\0')&&(cadena[m]!='\0')){
if(cadena[m]==cad[n]){
n++;
}
else{
n=0;}
m++;
}
if(n==strlen(cad)){
return (m-n)+1;
}
else{
return 0;}
}
int Cadena::Length(void){
return strlen(cadena);
}
Cadena Cadena::SubString(int indice,int cantidad){
Cadena temp;
int i=0;
if(cadena==NULL){
cadena = new char[1];
strcpy(cadena,"");
}
if(indice == 0){indice = 1;}
temp.cadena = new char[cantidad+1];
while(i<cantidad){
temp.cadena[i]=cadena[indice-1];
indice++;
i++;
}
return temp;
}
Cadena Cadena::Insert (char *cad,int indice){
Cadena temp;
if(cadena==NULL){
cadena = new char[1];
strcpy(cadena,"");
}
if(indice == 0) {
indice =1;
}
temp.cadena = new char[strlen(cadena)+1];
strcpy(temp.cadena,cadena);
delete[] cadena;
cadena =  new char[strlen(temp.cadena)+strlen(cad)+1];
strncat(cadena,temp.cadena,indice-1);
strcat(cadena,cad);
strcat(cadena,temp.SubString(indice,temp.Length()-indice+2).Str());
delete[] temp.cadena;
temp.cadena =  new char[strlen(cadena)+1];
strcat(temp.cadena,cadena);
return temp;
}
char* Cadena::Str (void){
return cadena;
}
Cadena Cadena::Delete (int indice,int cantidad){
Cadena temp;
if(cadena==NULL){
cadena = new char[1];
strcpy(cadena,"");
}
if(indice == 0) {
indice =1;
}
temp.cadena = new char[strlen(cadena)+1];
strcpy(temp.cadena,cadena);
delete[] cadena;
cadena =  new char[strlen(temp.cadena)-cantidad+1];
strncat(cadena,temp.cadena,indice-1);
strcat(cadena,temp.SubString(indice+cantidad,temp.Length()-indice-cantidad+2).Str());
delete[] temp.cadena;
temp.cadena =  new char[strlen(cadena)+1];
strcat(temp.cadena,cadena);
return temp;
}




Más información sobre la lista de distribución Cconclase