AnteriorPosterior

Tema 2 - Acercamiento a las cadenas

  Curso: C++ para gente que conoce C

2. Acercamiento a las cadenas


Es raro que un programa no manipule cadenas de texto, y se trata de un tipo de datos que es incómodo de manipular desde C, pero no desde C++. Por eso, vamos a ver lo básico de cómo manipularlas desde este lenguaje.

De paso, como las funciones que emplearemos con frecuencia están definidas dentro del espacio de nombres "std", abreviaremos un poco: ya no incluiremos "std::" delante de cada función, sino que usaremos la cláusula "using namespace std;" al principio del programa, para evitarnos ese trabajo.

Un primer ejemplo, que muestre que en C++ las cadenas son tan fáciles de manipular como los datos numéricos, podría ser:

#include <iostream>
#include <string>
using namespace std;
 
int main() {

    string texto1; // Cadena vacia
    string texto2 = "Hola"; // Cadena inicializada (1)
    string texto3("Juan"); // Cadena inicializada (2)

    texto1 = "Bienvenido. "; // Asigno valor
    texto2 += " "; // Añado un espacio al final

    texto1 = texto1 + texto2; // Combino dos cadenas
    if (texto3 == "Juan") // Y comparo

        cout << texto1 << texto3 << endl;
    else
        cout << texto1 << "Desconocido" << endl;

}
 
Este ejemplo debería ser muy fácil de seguir si se ha programado algo en C. Se puede dar un valor inicial con "=", o bien entre paréntesis, como si fuera el parámetro de una función. Se puede añadir más texto al final de una cadena con "+" (o de forma abreviada con "+="), y se puede comprobar su valor con "==".

Como se ve en este ejemplo, para usar cadenas al estilo de C++ (strings), debemos añadir al principio de nuestro programa la directiva include <string>

También es nueva para nosotros la forma de poner comentarios hasta final de línea con doble barra (pero también se pueden usar los comentarios de varias líneas "al estilo C", encerrados entre barras y asteriscos: /* Esto es un comentario */ .

Pero tenemos muchas más posibilidades "avanzadas", como son: saber su longitud (length), o directamente si está vacía (empty), saber el carácter que hay en cierta posición (at o []), extraer una subcadena (substr), insertar otra cadena en su interior (insert), reemplazar parte de sus letras por otras (replace), borrar cierta cantidad de letras (erase), buscar si contiene un texto (find), o convertir a una cadena "al estilo c" (c_str), como se ve en este ejemplo:

#include <iostream>

#include <string>
#include <cstdio>
using namespace std;
 
int main() {

    string texto = "Frase de prueba";
    cout << "La cadena es " << texto << endl;
    cout << "Cadena vacia? " << texto.empty() << endl;
    cout << "Su longitud es: " << texto.length() << endl;
    texto.insert(5,"cita");
    cout << "Ahora es " << texto << endl;
    cout << "La tercera letra es " << texto[2]

        << " o " << texto.at(2) << endl;
    texto.replace(6,3,"illa"); // Cambio "ita" por "illa"

    cout << "Y ahora " << texto << endl;
    string segundaPalabra = texto.substr(11,2);
    cout << "La segunda palabra es " << segundaPalabra << endl;
    int posicionDe = texto.find("de");
    cout << "La palabra 'de' esta en la posicion " 
        << posicionDe << endl;
    cout << "Si borramos 5 letras en la quinta posicion... ";
    texto.erase(5,5);
    cout << texto << endl;
    printf("Al estilo C: %s", texto.c_str() );

}
 


Como curiosidad, si necesitamos usar ficheros de cabecera de C, en el nuevo estándar de C++ se deberían preceder una de "c", como en el anterior "cstdio", que es el equivalente al <stdio.h> que es necesario en C para poder usar "printf".

Por supuesto, también se pueden aplicar las funciones de manipulaciones de cadenas de C (strcpy, strcmp, strstr...), siempre y cuando las apliquemos no sobre la cadena de C++ original sino sobre su conversión a C usando ".c_str()".


Al leer una cadena desde teclado, a veces lo más razonable no es usar cin >> cadena;, porque la lectura se interrumpe en el primer espacio en blanco. Para leer una frase completa, que pueda contener espacios, usaremos getline(cin, cadena);

Actualizado el: 09-12-2009 23:27

AnteriorPosterior