Programación 2: Guión Práctica 11
Cadenas de caracteres implementados con la clase std::string
Parte 1
1.0 Introducción
Una cadena en el Lenguaje de Programación C puede implementarse como un vector de char que tienen almacenado una colección valores de tipo char, terminados con el carácter nulo, es decir el valor numérico 0.
En el Lenguaje de Programación C++ existe la posibilidad de usar la clase std::string que implementa las cadenas de caracteres usando el paradigma de orientación por objetos. Los métodos de la clase std::string permiten manejar las cadenas de caracteres de forma eficiente , consistente y sencilla.
1.1Para usar la clase std::string es necesario incluir el archivo de declaraciones de la clase por medio de:
#include <string>
1.2 Creación de instancias de la clase std::string
std::string a; // crea una cadena vacia
std::string b(a); // crea un objeto por medio del constructor de copia
std::string c = “cadena de prueba 1”; // crea un objeto y lo inicializa por medio de un const char *
1.3 Algunos operadores
- Operadores de entrada y salida(Sea a un objeto de la clase std::string)std::cin >> a;getline(std::cin, a, ‘\n’);std::cout < < a;
- Operador de copia(Sea c y bun objeto de la clase std::string)c = b;c = “cadena de prueba 2”;
- Operador de concatenación(Sea c y a un objeto de la clase std::string)c += a;c = c + a;
- Operadores de relaciones de equivalencia(Sea a y b un objeto de la clase std::string)a == ba != b
- Operadores de relaciones de orden(Sea a y b un objeto de la clase std::string)a > ba >= ba < ba < = b
1.4 Otras operaciones útiles
Sean dadas las siguientes declaraciones:
std::string cad =”Cadena de prueba 3”;
std::string aux1;
char aux2[80];
- Buscarstd::cout < < cad.find(“de”,0); //imprime la posición de la primera ocurrencia de la cadena “de” dentro de cad
- Sustituircad.replace(2,2,”DE”); // cambia los caracteres 3 y 4 de la cadena por la cadena “DE”
- Borrarcad.erase(7,2); // Borra los caracteres 8 y 9 de la cadena cad
- Crear sub-cadenasaux1 = cad.substr(2,4); // Crea una cadena con los cuatros caracteres consecutivos a partir del tercer carácter de la cadena cad.
- Método std::string::c_str() para la compatibilidad con funciones que requieran const char *strcpy(aux2, cad.c_str()); // Genera una secuencia de caracteres terminados en NULL a partir del contenido de cad
1.5 Referencia: www.cplusplus.com
1.6 Guarde el siguiente programa (tomado de www.yolinux.com). Luego compilarlo y ejecutarlo para observar los resultados
#include <string> using namespace std; int main(){ string a(”abcd efg”); string b(”xyz ijk”); string c; cout < < a << " " << b << endl; // Output: abcd efg xyz ijk cout < < "String empty: " << c.empty() << endl; // String empty: 1 // Is string empty? Yes it is empty. (TRUE) c = a + b; // concatenation cout < < c << endl; // abcd efgxyz ijk cout < < "String length: " << c.length() << endl; // String length: 15 cout < < "String size: " << c.size() << endl; // String size: 15 cout < < "String capacity: " << c.capacity() << endl; // String capacity: 15 cout < < "String empty: " << c.empty() << endl; // String empty: 0 // Is string empty? No it is NOT empty. (FALSE) string d = c; cout < < d << endl; // abcd efgxyz ijk // First character: a cout < < "First character: " << c[0] << endl; // Strings start with index 0 just like C. string f(" Leading and trailing blanks "); cout < < "String f:" << f << endl; cout < < "String length: " << f.length() << endl; // String length: 37 cout < < "String f:" << f.append("ZZZ") << endl; // String f: Leading and trailing blanks ZZZ cout < < "String length: " << f.length() << endl; // String length: 40 string g("abc abc abd abc"); cout < < "String g: " << g << endl; // String g: abc abc abd abc cout < < "Replace 12,1,\"xyz\",3: " << g.replace(12,1,"xyz",3) << endl; // Replace 12,1,"xyz",3: abc abc abd xyzbc cout < < g.replace(0,3,"xyz",3) << endl; // xyz abc abd xyzbc cout < < g.replace(4,3,"xyz",3) << endl; // xyz xyz abd xyzbc cout < < g.replace(4,3,"ijk",1) << endl; // xyz i abd xyzbc cout < < "Find: " << g.find("abd",1) << endl; // Find: 6 cout < < g.find("qrs",1) << endl; string h("abc abc abd abc"); cout < < "String h: " << h << endl; cout < < "Find \"abc\",0: " << h.find("abc",0) << endl; // Find "abc",0: 0 cout < < "Find \"abc\",1: " << h.find("abc",1) << endl; // Find "abc",1: 4 cout < < "Find_first_of \"abc\",0: " << h.find_first_of("abc",0) << endl; // Find_first_of "abc",0: 0 cout < < "Find_last_of \"abc\",0: " << h.find_last_of("abc",0) << endl; // Find_last_of "abc",0: 0 cout < < "Find_first_not_of \"abc\",0: " << h.find_first_not_of("abc",0) << endl; // Find_first_not_of "abc",0: 3 cout < < "Find_first_not_of \" \": " << h.find_first_not_of(" ") << endl; // Find_first_not_of " ": 0 cout < < "Substr 5,9: " << h.substr(5,9) << endl; // Substr 5,9: bc abd ab cout < < "Compare 0,3,\"abc\": " << h.compare(0,3,"abc") << endl; // Compare 0,3,"abc": 0 cout < < "Compare 0,3,\"abd\": " << h.compare(0,3,"abd") << endl; // Compare 0,3,"abd": -1 cout < < h.assign("xyz",0,3) << endl; // xyz cout < < "First character: " << h[0] << endl; // Strings start with 0 // First character: x }
Parte II: Trabajo práctico
2.1 Diseñe y construya un programa que por medio de el método de concatenación prueba la capacidad máxima de un objeto de la clase std::string, use un entero “muy largo” para registrar el tamaño de la cadena.
2.2 Diseñe y construya un programa en C++ que por medio de un objeto de la clase std::string que convierta fechas almacenas en cadenas de la forma DD/MM/YYYY en fechas almacenadas en cadena de la forma DD de MES de AÑO. Ejemplo: “22/04/2010” en “22 de Abril de 2010”
2.3 Diseñe y construya un programa en C++ realice la conversión inversa solicitada en 2.2
2.4 Diseñe y construya un programa en C++ que se comporte de la misma manera que el programa wc del sistema LINUX, solo que la lectura debe hacerse desde el teclado hasta que se lea una línea vacía.
Realizado por:
versión 1.0
Abril, 2010
Revisado por: