Introducción a la computación
Clase 10
Cadena de caracteres
Prof. Marcos Alania
[email protected] Lima, 22 Agosto, 2020
Cadena de caracteres
➢ El tipo de dato cadena no existe en C/C++
➢ Para manipular cadena de caracteres utilizamos un vector del tipo char
o string
Declaración
char nombre_cadena[longitud]
Nota
Hay que tener cuidado al definir el vector para la cadena de caracteres, ya que esto
puede conllevar a cometer errores
char cadena_caracteres[5] = {‘a',‘e',‘i',‘o',‘u'};
char cadena_caracteres[5] = "maria";
Aparentemente ambos hacen lo mismo, pero el problema viene en el espacio que se
reserva en la memoria. El primer caso esta bien definido, en el segundo caso no.
2
Cadena de caracteres
Primer caso
3
Cadena de caracteres
C++ no acepta una cadena de caracteres como elemento de un arreglo.
Segundo caso
char cadena_caracteres[] = "maria";
En este caso C++ separa un carácter para la secuencia de escape \0, se llama
carácter nulo
m a r i a \0
La definición correcta seria de la forma:
char cadena_caracteres[6] = "maria";
4
Cadena de caracteres: Operaciones Básicas
Librería cstring
strcpy(s1, s2); Copia la cadena s2 a la cadena s1
strcat(s1, s2); Concatena la cadena s2 al final de la cadena s1
strlen(s1); Retorna la longitud de la cadena s1
strcmp(s1, s2); Retorna 0 si s1 y s2 son iguales ; menor que 0 si s1<s2 ;
mayor que 0 si s1>s2
strchr(s1, ch); Retorna un puntero a la primera aparición de el carácter ch
en la cadena s1
strstr(s1, s2); Retorna un puntero la primera aparición de la cadena s2 en
la cadena s1
5
Cadena de caracteres: Operaciones Básicas
#include <iostream>
#include <cstring>
La librería cstring - es
using namespace std; la version C++ de la
int main () {
librería string.h
char str1[14] = "Maxima";
char str2[14] = "Determinacion";
char str3[14];
int len ;
// copia str1 a str3
strcpy( str3, str1);
cout << "strcpy( str3, str1) : " << str3 << endl;
// concatena str1 y str2
strcat( str1, str2);
strcpy( str3, str1) : Maxima
cout << "strcat( str1, str2): " << str1 << endl;
strcat( str1, str2): MaximaDeterminacion
strlen(str1) : 19
// La longitud total de str1 despues de la concatenacion
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;
}
6
Cadena de caracteres: Operaciones Básicas
#include <iostream>
#include <cstring>
using namespace std;
int main () {
string str1 = "Maxima";
string str2 = "Determinacion";
string str3;
int len ;
// copia str1 a str3
str3 = str1; str3: Maxima
cout << "str3 : " << str3 << endl;
str1+str2:MaximaDeterminacion
// concatena str1 y str2 str3.size(): 19
str3=str1+ str2;
cout << "str1 + str2: " << str3 << endl;
/* La longitud total de str3 despues de la
concatenacion */
len = str3.size();
cout << "str3.size(): " << len << endl;
return 0;
}
7
Cadena de caracteres: Operaciones Básicas
// Inicializacion por cadena
string str1("Primera_Cadena");
// Inicializacion por otra cadena
string str2(str1);
// Inicializacion por caracter con un número de apariciones
string str3(5, '#');
// Inicializacion por una parte de otra cadena
string str4(str1, 7, 6); // desde 7 mo indice (2do parametro)
// 6 caracteres (3er parametro)
// Inicializacion por parte de otra cadena : iterator version
string str5(str2.begin(), str2.begin() + 7);
cout << "str1: " << str1 << endl;
cout << "str2: " << str2 << endl;
cout << "str3: " << str3 << endl; str1: Primera_Cadena
cout << "str4: " << str4 << endl; str2: Primera_Cadena
cout << "str5: " << str5 << endl;
str3: #####
str4: _Caden
str5: Primera
8
Cadena de caracteres: Buscando caracteres
// la funcion clear borra todos los caracteres de la cadena
str4.clear();
// las funciones size() and length() retornan la longitud de la cadena
int len = str6.length(); // igual que "len = str6.size();"
cout << "str6: " << str6 << endl;
cout << "la longitud de la cadena str6 es : " << len << endl;
// un caracter se puede acceder utilizando - at
char ch = str6.at(2); // Igual que "ch = str6[2];"
cout << "El tercer caracter de la cadena str6 es : " << ch << endl;
// front retorna el primer caracter y back retorna el ultimo caracter
// de la cadena
char ch_f = str6.front(); // Igual que : "ch_f = str6[0];"
char ch_b = str6.back(); // Igual que : "ch_b = str6[str6.length() - 1];"
str6: _Caden
la longitud de la cadena str6 es : 6
El tercer caracter de la cadena str6 es : a
El Primer caracter de str6 es : _
El ultimo caracter es: n
9
Cadena de caracteres: Trabajando con sub-cadenas
cout << "str6: " << str6 << endl;
// append - agregar la cadena argumento al final
str6.append(" extension"); // Igual que str6 += " extension"
// otra version de append, agrega parte de otra cadena
str4.append(str6, 0, 6); // en la posicion 0, 6 caracteres
cout << "str6: " << str6 << endl;
cout << "str4: " << str4 << endl;
// find retorna el indice donde se encuentra el patron.
// si el patron no se encuentra retorna la constante npos que vale -1
if (str6.find(str4) != string::npos)
cout << "str4 se encontro en str6 en la posicion " << str6.find(str4) << endl;
else
cout << "str4 no se encontro str6" << endl;
str6: _Caden
str6: _Caden extension
str4: _Caden
str4 se encontro en str6 en la posicion 0
10
Cadena de caracteres: Trabajando con sub-cadenas
// La funcion substr(a, b) retorna una subcadena de longitud b
// empezando desde el indice a
cout << "str6.substr(7, 3) : " << str6.substr(7, 3) << endl;
//si no se pasa el segundo argumento se sobreentiende hasta el final
cout << "str6.substr(7) : " << str6.substr(7) << endl;
// erase(a, b) borra b caracteres en el indice a
str6.erase(7, 4);
cout << "str6.erase(7, 4) " << str6 << endl;
// la version iterator de erase
str6.erase(str6.begin() + 5, str6.end() - 3);
cout << " str6.erase(str6.begin() + 5, str6.end() - 3) :" << str6 <<
endl;
str6: _Caden extension
str6.substr(7, 3) : ext
str6.substr(7) : extension
str6.erase(7, 4);_Caden nsion
str6.erase(str6.begin() + 5, str6.end() - 3) :_Cadeion
11
Cadena de caracteres: Trabajando con sub-cadenas
// Busca si la cadena tiene una parte flotante
string fnum = "23.342";
string str;
int fpart;
int pos = fnum.find(".");
if (pos == string::npos)
cout << "Numero no tiene parte flotante"<< endl;
else
cout << "La parte flotante es : " <<fnum.substr(pos + 1) << endl;
La parte flotante es : 342
12
Cadena de caracteres: Trabajando con sub-cadenas
// Busca si la cadena contiene sólo digitos
string num = "34A52";
int l = num.length();
bool solodigitos = true;
for (int i = 0; i < l; i++)
{
if (num.at(i) < '0' || num.at(i) > '9'){
cout << "La cadena NO contiene solamente digitos" << endl;
solodigitos = false;
}
}
// si la cadena tiene solo digitos
if (solodigitos)
cout << "La cadena SI contiene solamente digitos" << endl;
La cadena NO contiene solamente digitos
13
Cadena de caracteres: Trabajando con sub-cadenas
// Reemplaza los espacios en blanco por %20 - como se usa en las URL
string urlex = "google com in";
string replaceby = "%20";
int n = 0;
// Hacer un ciclo hasta que todos los espacios son reemplazados
while ((n = urlex.find(" ", n)) != string::npos )
{
urlex.replace(n, 1, replaceby);
n += replaceby.length();
}
cout << "URL con espacios reemplazados: " << urlex << endl;
URL con espacios reemplazados: google%20com%20in
14
Cadena de caracteres
Cadena de caracteres usando la librería string
15
Cadena de caracteres
Cadena de caracteres usando la librería string
16
Cadena de caracteres: Librería string
Resumen de algunas funciones de la librería string
● append(): esta función agrega una parte de una cadena a otra cadena
● assign():esta función asigna una cadena parcial
● at(): esta función obtiene el carácter almacenado en una ubicación específica
● begin(): esta función devuelve una referencia al inicio de la cadena
● capacity(): esta función da el espacio en memoria reservado
● compare(): esta función compara una cadena con otra
● empty(): esta función devuelve verdadero si la cadena está vacía
● end(): esta función devuelve una referencia al final de la cadena
● erase(): esta función elimina el (los) carácter(es) especificado(s)
● find(): esta función busca la ocurrencia de una subcadena especificada
● length():da el tamaño de una cadena o el número de elementos de una
cadena
● swap(): esta función intercambia la cadena dada con la que invoca
17