Sunteți pe pagina 1din 10

ManejodecadenasenC++

Introduccinamanejodecadenas

VeamosahoracmomanejarcaracteresconC++.Paraempezar,lamaneradealmacenartextoesutilizando
arraysoarreglosdechar.Funcionanigualquelosdemsarraysconladiferenciadequeahorasemanejanletras
envezdenmeros.Selesllamacadenas,stringsocadenasdecaracteres.
Paradeclararunacadenadecaracteressehacecomoenelcasodeunarreglo.Porejemplo,siqueremosdeclarar
unacadenadeunalongitudde5caracteressehara:
chartexto[5]=ABC;

Aligualqueenlosarreglos,nopodemosintroducirmsde5elementosenlacadena.Entonces,unacadenaes
unarreglodecaracteres(char)terminadoenuncarcternulo(\0).
Arreglodecaracteres

CadenadeCaracteres

\0

Lascadenassedeclarancomolosarreglos.Seinicianconcomillas.
chartexto[5]=ABC;//cadenasde4caracterescomomximo

Funcionesdemanejodecadenas

ExistenunascuantasfuncionesenlabibliotecaestndardeCparaelmanejodecadenas.Parasuusosedebe
incluirlalibrerastring.h.
#include<cstring>
strlen:Estafuncindevuelveelnmerodecaracteresquetienelacadena(sincontarel'\0').
#include<iostream>
#include<cstring>
usingnamespacestd;
intmain()
{
chartexto[]="ProgramacinIdeEIEUES";
intlongitud;

longitud=strlen(texto);
cout<<"Lacadena"<<texto<<"tiene"<<longitud<<"caracteres"<<endl;
return0;

Lasalidaes:LacadenaProgramacinIdeEIEUEStiene25caracteres
Enelcasodenodisponerdeestafuncin,debedeusarsepunterosparamedirlalongituddelacadena,y
recorrerlaelementoporelemento,incrementandouncontador.
ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

ManejodecadenasenC++

strcpy:Estafuncincopiaelcontenidodeunacadenaorigenenotracadenadestino.Sedebetenercuidadode
quelacadenadestinotengaespaciosuficienteparaalbergaralacadenaorigen.
#include<iostream>
#include<cstring>
usingnamespacestd;
intmain()
{
chartexto[]="ProgramacinIdeEIEUES";
chardestino[50];
strcpy(destino,texto);
cout<<"Eltextodecadenadestinoes:"<<destino<<endl;
return0;
}

strcat:Estafuncinconcatenadoscadena(cadena1ycadena2),guardandoelresultadoenlacadena1.
strcat(cadena1,cadena2);
#include<iostream>
#include<cstring>
usingnamespacestd;
intmain()
{
chartexto1[]="ProgramacionI";
chartexto2[]="EIEUES";
charcadena1[strlen(texto1)+strlen(texto2)];
strcpy(cadena1,texto1);
cout<<"Contenidodecadena1:"<<cadena1<<endl;
strcat(cadena1,"de");
cout<<"Contenidodecadena1:"<<cadena1<<endl;

strcat(cadena1,texto2);
cout<<"Contenidodecadena1:"<<cadena1<<endl;
return0;

Comosiempre,tenemosqueasegurarquelavariablealaqueaadimoslasdemscadenastengaeltamao
suficiente.Usamos strcpy paraasegurarnosdequequedaborradocualquierdatoanterioryquesolocontenga
texto1.Luegousamosunstrcatparaaadirunacadenaextrayluegoparaintroducirtexto2.
strcmp:Comparacadena1ycadena2.Devuelveuncerosisoniguales,unnmeropositivosicadena1esmayor
quecadena2,yunnmeronegativosieslocontrario.
int<0sicadena1<cadena2
int=0sicadena1=cadena2
int>0sicadena1>cadena2
ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

ManejodecadenasenC++

#include<iostream>
#include<cstring>
usingnamespacestd;
intmain()
{
constchar*texto1="ProgramacionI";
constchar*texto2="EIEUES";
cout<<"Comparacinconstrcmp:"<<strcmp(texto1,texto1)<<endl;//0
cout<<"Comparacinconstrcmp:"<<strcmp(texto1,texto2)<<endl;//1
cout<<"Comparacinconstrcmp:"<<strcmp(texto2,texto1)<<endl;//1
return0;
}

Declararunacadenadeestamanera,noproduceerror,peromuestraelsiguientemensaje:
warning:deprecatedconversionfromstringconstanttochar*
advertencia:conversinobsoletadecadenaconstantea'char*'

Ejerciciootarea:Escribirunafuncinusandopunterosquepuedacalcularlalongituddeunacadenasinusarla
funcinstrlen()delalibrerastring.h.
//char01.cpp
//Recorridodecadenasconpunteros
//paraconocereltamaniodelarreglo
#include<iostream>
usingnamespacestd;
intstrlong(char*cadena)
{
inttamanio=0;
while(*cadena!='\0')
{
tamanio++;//entero
cadena++;//puntero
}
returntamanio;
}
intmain(){
chartexto[]="ProgramacinIdeEIEUES";
intlongitud;
longitud=strlong(texto);
cout<<"Lacadena"<<texto<<"tiene"<<longitud<<"caracteres"<<endl;

return0;

ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

ManejodecadenasenC++

Lecturayescrituradecadenasdesdeconsola
leer

cin>>nombredelarrayquerecibelacadena

cin>>texto;

escribir

cout<<nombredelarrayquecontienelacadena

cout<<texto;

Problemas:
cin no hace comprobacin de lmites, de manera que es posible que el usuario introduzca ms
caracteresquelosquepuedaalmacenarlacadena.
Tambin,alintroducirunacadena,porejemploHolamundodesdeteclado,C++dejadeleercuando
encuentraelprimerespacioenblancoyporlotantoslohabralmacenadoHola.
#include<iostream>
usingnamespacestd;
intmain()
{
chartexto[75];
cin>>texto;
cout<<texto<<endl;
return0;

Enestecaso:
SilaspalabrasdigitadassonHolamundo,cinsoloalmacenaenlavariabletexto
lacadenadecaracteres'Hola'

Parasolucionaresto,istreamproporcionalasherramientasdeentradaconformatoysinformato,Porlogeneral,
eloperadordeextraccindeflujo(esdecireloperador<<)omiteloscaracteresde espacioenblanco (como
espacios,tabuladoresycaracteresdenuevalinea)enleflujodeentrada.Veamosesasherramientas.

Funcinget()
La clase istream contiene una funcin miembro para la introduccin de cadenas completas de caracteres,
incluyendoespaciosenblanco, get().Estafuncinnorealizaconversiones,simplementeaceptaunacadenade
caracteres, ylos sitaenla variable adecuada. Realmente get() es una familia de funciones sobrecargadas,
algunodelosprototiposson:

istream&get(char*cad,intlongitud,charfin='\n');

donde:
cadesunavariabledecadenadecaracteres.
longitudeslalongitudmximadelacadenadeentrada.
finesuncarcterespecficoqueproducelaterminacindelaentrada.Pordefectoes\n.
Asestafuncinaceptarcaractereshastaquesealcancelalongitudmximaoseintroduzcaelcarcter
determinacin.
ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

ManejodecadenasenC++

istream&get(unsignedchar&);
istream&get(signedchar&);
Losdosltimosprototipossirvenparaintroduciruncarcter.
cin.get();//puedeservirparapausarlaejecucindeunprograma

#include<iostream>
usingnamespacestd;
intmain()
{
chartexto[75];

cin.get(texto,75);
cout<<texto<<endl;
return0;

Enestecaso:
Si las palabras digitadas son Hola mundo, cin.get() almacena en la variable
textotodacadenadecaracteres(incluidoelespacioenblanco)'Holamundo'

Sinembargo,estafuncinpuedellegaraserbastanteproblemticasinosetieneunpocodecuidado,yaque
get()dejaelcarcterdeterminacinenunacola(nombradofinenelprototipodelafuncin),aselsiguiente
programanofuncionaracomodebiera,yaquelasegundacadenanuncasellegaapedir.
#include<iostream>
usingnamespacestd;
intmain()
{
charc1[80];
charc2[4];
cout<<"Introduceunacadena:"<<endl;
cin.get(c1,80);
cout<<"Introduceunacadena:"<<endl;
cin.get(c2,4);
cout<<c1<<endl<<c2<<endl;
return0;

ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

ManejodecadenasenC++

Funcingetline()
Estafuncinmiembrodeistreamoperadeformaanlogaalafuncinget(),siendosuprototipo:
istream&getline(char*cad,intlongitud,charfin='\n');

cadeselnombredelavariablequevaacontenerlacadena.
longitud es la cantidad de caracteres que queremos que se puedan introducir (nunca mayor que la
longituddelcadena).
fin eselcaracterqueelusuariovausarcomofinaldelacadena.Porlogeneraleselenterquese
representacomo\n(diagonaln).

Sudiferenciaconlafuncinmiembro get() esqueelcarcterdeterminacinseleeantesdequeseaadael


carcter'\0'.Enconsecuenciaestafuncinnodejaelcarcterdeterminacinenunacola.
Conloqueahorapodemossolucionarelproblemaquesenoshabaplanteadoantes.Podemoscolocargetline()
enlaprimeralecturadelteclado.
#include<iostream>
usingnamespacestd;
intmain()
{
charc1[80];
charc2[4];
cout<<"Introduceunacadena(getline):"<<endl;
cin.getline(c1,80);//caracterdeterminacion('\n')essacadodelflujo
cout<<"Introduceunacadena(get):"<<endl;
cin.get(c2,4);
cout<<c1<<endl<<c2<<endl;
return0;
}

Funcinignore()
Estaesotradelasfuncionesmiembrodelaclaseiostream.Suprototipoes:
istream&ignore(intn=1,intdelim=EOF);

Elobjetivodeestafuncinesignorarncaracteresdelstreamdeentrada,ohastaqueencuentreelcarcterdelim.
Aslasentencia.
cin.ignore(25,'\n');
Leedeltecladoeignoralossiguientes25caracteresohastaqueseproduzcaelprimersaltodelnea,loprimero
queocurra.Veamoselsiguienteprogramacomoejemplo.

ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

ManejodecadenasenC++

#include<iostream>
usingnamespacestd;
intmain(){
constintLONG=25;
charcadena[LONG];
cout<<"Introduceunacadena(getline):"<<endl;
cin.getline(cadena,LONG,'%');//'%'essacadodelflujo
cout<<"Cadena="<<cadena<<endl;
charch;
cin.get(ch);//capturaelcaracterquelesiguea'%'
cout<<"Elsiguientecarcterdeentradaes:"<<ch<<endl<<endl;
cin.ignore(LONG,'\n');//ignoraelrestodelacadenaleidadelteclado
cout<<"Introduceunacadena(get):"<<endl;
cin.get(cadena,LONG,'%');'%'sigueelstreamoflujo
cout<<"Cadena="<<cadena<<endl;
cin.get(ch);//aquich='%'
cout<<"Elsiguientecarcterdeentradaes:"<<ch<<endl;
return0;
}

Salida:
Introduceunacadena(getline):
abcdef%246
Cadena=abcdef
Elsiguientecarcterdeentradaes:2
Introduceunacadena(get):
abdcef%246
Cadena=abdcef
Elsiguientecarcterdeentradaes:%

Observarquemientrasquegetline()descartaelcarcterlmite%enlaentrada,get()nolohace.

Laclasestringdelabibliotecaestndar
Hemosvistocomoelmanejodearreglosocadenasdecaracteres,requiereunconocimientodevariasfunciones
previamente definidas en la librera string.h. Sin embargo, con la creacin de clases, puede facilitarse los
procesosqueinvolucranmanejodecadenas.Porejemplo,podracrearseunaclasestringqueseramuchomejor
quelascadenaschar*estiloC,queC++absorbideC.
Paracrearclasestilesyreutilizablesserequieredemuchotrabajo.Sinembargo,unavezqueestasclasesse
pruebanydepuran,puedenserreutilizadasporunomismo,porcolegas,porlainstitucin,muchasempresas,
ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

ManejodecadenasenC++

todaunaindustriaoinclusomuchasindustrias(sisecolocanenbibliotecaspblicasodeventaalpblico).Los
diseadoresdeC++hicieronexactamenteeso,crearlaclasestringenellenguajeC++estndar.Estaclasese
encuentradisponibleenlaBibliotecaestndardeC++paracualquieraquecreeaplicacionesenestelenguaje.
string.h
char(tipodedatos)
string(clase)

Utilizacindelaclasestring
Elprogramaescritoacontinuacin,vuelvearealizarlamayoradeoperacionesquesesuelenhacerconcadenas
decaracteres,perousandolaclasestringestndar.Comoveremosenesteejemplo,laclasestringproporciona
todalafuncionalidaddeltipodedatoschar.

//char02.cpp
//ProgramadepruebadelaclasestringdelaBibliotecaestndar.
#include<iostream>
#include<cstring>
usingnamespacestd;

intmain(intargc,char*argv[])
{
cout<<"ClasestringparaC++"<<endl;
cout<<""<<endl<<endl;

strings1="Esto",s2="es";//definicioneinicializacion
strings3("una"),s4("oracion");//devariabletipostring
strings5;

cout<<"Stringenpartes:"<<endl;
cout<<'\t'<<s1<<endl;
cout<<'\t'<<s2<<endl;
cout<<'\t'<<s3<<endl;
cout<<'\t'<<s4<<endl<<endl;
//pruebalafuncionmiembroempty()destring
if(s5.empty())
{
cout<<"s5estavacia;seasignos1ytexto;"<<endl;
s5=s1+"yaquello";
cout<<"s5es\""<<s5<<"\""<<endl<<endl;
}

s5=s1+""+s2+""+s3+""+s4;//concatenacion
cout<<"Concatenandolascadenas:"<<endl;
cout<<'\t'<<s5<<endl<<endl;

ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

ManejodecadenasenC++

strings6,s7;//definiciondevariables
cout<<"Introducirlacadenas6(sinespaciosenblanco):";
cin>>s6;
cout<<"Introducirlacadenas7(sinespaciosenblanco):";
cin>>s7;
cout<<endl;
//tamaniodecadena
cout<<"lastrings6("<<s6<<")tiene"<<s6.size()<<"letras."<<endl;
cout<<"lastrings7("<<s7<<")tiene"<<s7.size()<<"letras."<<endl;
cout<<endl;

//pruebalosoperadoresdeigualdadyrelacionessobrecargados
cout<<"s6<s7\t=>"<<(s6<s7?"true":"false")<<endl;
cout<<"s6>=s7\t=>"<<(s6>=s7?"true":"false")<<endl;
cout<<"s6==s7\t=>"<<(s6==s7?"true":"false")<<endl;
cout<<"s6!=s7\t=>"<<(s6!=s7?"true":"false")<<endl;

if(s6==s7)
cout<<"Stringsiguales"<<endl;
else
cout<<"Stringsdiferentes"<<endl;
cout<<endl;

//pruebaeloperadordeconcatenacinsobrecargadodestring
cout<<"s6+s7\t=>"<<s6+s7<<endl;
s5+=s7;
cout<<"s5+=s7\t=>"<<s5<<endl;
cout<<endl;

//convertiramayusculas
cout<<"Convertiramayusculas:"<<endl;
for(inti=0;i<s5.size();i++)
s5[i]=toupper(s5[i]);
cout<<"\t"<<s5<<endl<<endl;

//pruebalafuncinmiembrosubstrdestring
cout<<"Subcadenas:"<<endl;
stringsub_s6;
sub_s6=s6.substr(2,3);//3letrasdes6,desdelas[2]as[4]
cout<<"\t"<<sub_s6<<endl;

stringsub_s7(s7,5);//desdeposicions[5]hastaelfinal,des7
cout<<"\t"<<sub_s7<<endl;
//pruebalafuncinmiembroinsertdestring
s6.insert(3,"OOO");//insertaruntextoenlaposicions[3]
cout<<"\t"<<s6<<endl;
//pruebalafuncinmiembroreplacedestring
s7.replace(2,3,"RAN");//cambio3letrasdesdelaposicions[2]
cout<<"\t"<<s7<<endl;
return0;
}

ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

ManejodecadenasenC++

Salida:
ClasestringparaC++

Stringenpartes:
Esto
es
una
oracion
s5estavacia;seasignos1ytexto;
s5es"Estoyaquello"
Concatenandolascadenas:
Estoesunaoracion
Introducirlacadenas6(sinespaciosenblanco):limon
Introducirlacadenas7(sinespaciosenblanco):naranja
lastrings6(limon)tiene5letras.
lastrings7(naranja)tiene7letras.
s6<s7=>true
s6>=s7=>false
s6==s7=>false
s6!=s7=>true
Stringsdiferentes
s6+s7=>limonnaranja
s5+=s7=>Estoesunaoracionnaranja
Convertiramayusculas:
ESTOESUNAORACIONNARANJA
Subcadenas:
mon
ja
limOOOon
naRANja

ProgramacinIEscueladeIngenieraElctricaUES(v.2015)

10

S-ar putea să vă placă și