Documente Academic
Documente Profesional
Documente Cultură
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).
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