AnteriorPosterior

6b.Cadenas de texto (2 - al estilo de C++)

  Curso: Introducción a C++

6.2. Cadenas de texto al estilo de C++

6.2.1. Definición y lectura desde teclado

Será básicamente igual que cuando leemos cualquier otro tipo de dato nativo del sistema. En este caso, el tipo de datos se llama "string":

// Introducción a C++, Nacho Cabanes
// Ejemplo 06.11:
// Primer ejemplo de cadenas de texto al estilo C++
 
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string texto;
 
    cout << "Introduce tu nombre: ";
    cin >>  texto;
    cout << "Hola " <<  texto << endl;
 
    return 0;
}
 

Dos cosas a tener en cuenta:

  • Al igual que ocurría con las cadenas "al estilo de C", si el texto contiene espacios, se lee sólo hasta el primer espacio.
  • Habrá que incluir <string> al principio de nuestro programa. Cuidado: no es <string.h>, que es el nombre que recibe <cstring> si usamos la nomenclatura de C en vez de la de C++, sino sólo <string>, sin la "c" inicial y sin el ".h" final.

Ejercicio propuesto:

  • (6.2.1.1) Un programa que te pida tu nombre y una cifra numérica, y escriba tu nombre tantas veces como indique esa cifra numérica, usando cadenas al estilo de C++.

6.2.2. Acceder letra a letra

Lo haríamos igual que si cuando se trata de una cadena "al estilo de C" o de un array, usando corchetes:

// Introducción a C++, Nacho Cabanes
// Ejemplo 06.12:
// Cadenas de texto al estilo C++: acceder letra a letra
 
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string texto;
 
    cout << "Introduce tu nombre: ";
    cin >>  texto;
    cout << "Hola, " << texto 
		<< ". Tu inicial es " << texto[0] 
		<< " y tu segunda letra " << texto.at(1) 
		<< endl;
 
    return 0;
}
 

Ejercicio propuesto:

  • (6.2.2.1) Un programa que pida al usuario que introduzca una palabra y muestre su segunda y tercera letras.
  • (6.2.2.2) Un programa que pida al usuario que introduzca una palabra, cambie su primera letra por una "A" y muestre la palabra resultante.

6.2.3. Longitud de la cadena.

Para saber la cantidad de letras que contiene una cadena de texto, añadiremos ".length()" a su nombre, así:

// Introducción a C++, Nacho Cabanes
// Ejemplo 06.13:
// Longitud de una cadena de C++
 
#include <string>
#include <iostream>
using namespace std;
 
 
int main()
{
    string texto;
 
    cout << "Introduce una palabra: ";
    cin >>  texto;
    cout << "Has tecleado " << texto.length()
        << " letras." << endl;    
 
    return 0;
}
 

Ejercicios propuestos:

  • (6.2.3.1) Un programa que te pida tu nombre y lo muestre en pantalla separando cada letra de la siguiente con un espacio. Por ejemplo, si tu nombre es “Juan”, debería aparecer en pantalla “J u a n”.
  • (6.2.3.2) Un programa que te pida tu nombre y lo muestre en pantalla separando al revés. Por ejemplo, si tu nombre es “Juan”, debería aparecer en pantalla “nauJ”.

6.2.4. Subcadenas

Podemos extraer un fragmento de una cadena si usamos ".substr(inicio, longitud)", como en este ejemplo:

// Introducción a C++, Nacho Cabanes
// Ejemplo 06.14:
// Tomar 4 letras de una cadena de C++
 
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    string texto1, texto2, texto3;
 
    cout << "Introduce un frase: ";
    cin >>  texto1;
 
    texto2 = texto1;
    cout << "Una copia de tu texto es " << texto2 << endl;
    texto3 = texto1.substr(0, 4);
    cout << "Y sus 4 primeras letras son " << texto3  << endl;
 
    return 0;
}
 

Ejercicio propuesto:

  • (6.2.4.1) Un programa que te pida tu nombre y escriba un triángulo que empiece con una letra, siga con 2 y vaya aumentando hasta llegar a la longitud total, así:
N
Na
Nac
Nach
Nacho

6.2.5. Unir (concatenar) cadenas

Podemos juntar dos cadenas en una simplemente "sumándolas", con el símbolo de la suma. De forma alternativa, también podemos usar ".append" para añadir al final de una cadena existente o ".assign" para cambiar su valor (para lo que hasta ahora hemos usado el símbolo de "igual"):

// Introducción a C++, Nacho Cabanes
// Ejemplo 06.15:
// Concatenar dos cadenas de C++
 
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    string texto1, texto2, texto3;
 
    cout << "Introduce tu nombre: ";
    cin >>  texto1;
 
    cout << "Introduce tu apellido: ";
    cin >>  texto2;
 
    texto3 = texto1 + " " + texto2;
    cout << "Te llamas " << texto3 << endl;
 
    string texto4;
    texto4.assign(texto1);
    texto4.append(" ");
    texto4.append(texto2);
    cout << "O bien " << texto4 << endl;
 
    return 0;
}
 

Ejercicio propuesto:

  • (6.2.5.1) Un programa que te pida una un número y palabra, y cree una nueva palabra formada por la concatenación de esa palabra varias veces. Por ejemplo, si la palabra es "C++" y el número es el 4, la cadena resultante deberá ser "C++C++C++C++". Finalmente, se deberá mostrar esta cadena en pantalla.

6.2.6. Comparar

Para ver si son iguales dos cadenas podemos usar el doble símbolo de igualdad (==), como hacíamos con los números. De igual modo, podemos usar el símbolo de desigualdad (!=) para ver si no contienen el mismo texto. También podemos usar ".compare(texto2)", que nos dará 0 como resultado si son siguales u otro número si no lo son:

// Introducción a C++, Nacho Cabanes
// Ejemplo 06.16:
// Comparar dos cadenas de C++
 
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    string texto1, texto2;
 
    cout << "Introduce una palabra: ";
    cin >>  texto1;
 
    cout << "Introduce otra palabra: ";
    cin >>  texto2;
 
    if (texto1 == texto2)
        cout << "Son iguales" << endl;
    else
        cout << "Son distintas" << endl;
 
     cout << "De otra manera: " << endl;
 
     if (texto1.compare(texto2) == 0)
        cout << "Son iguales" << endl;
    else
        cout << "Son distintas" << endl;
 
    return 0;
}
 

De hecho, "compare" nos dará un resultado positivo si la primera cadena es mayor que la segunda, y un resultado negativo si la mayor es la segunda. Incluso podemos utilizar también los símbolos de "mayor que" y "menor que":

// Introducción a C++, Nacho Cabanes
// Ejemplo 06.17:
// Comparar dos cadenas de C++
 
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    string texto1, texto2;
 
    cout << "Introduce una palabra: ";
    cin >>  texto1;
 
    cout << "Introduce otra palabra: ";
    cin >>  texto2;
 
    int comparacion = texto1.compare(texto2);
 
    if (comparacion==0)
        cout << "Son iguales" << endl;
    else
        if (comparacion>0)
            cout << "La primera palabra es mayor" << endl;
        else
            cout << "La segunda palabra es mayor" << endl;
 
    cout << "Volvemos a intentar... " << endl;
 
    if (texto1 == texto2)
        cout << "Son iguales" << endl;
    else
        if (texto1 > texto2)
            cout << "La primera palabra es mayor" << endl;
        else
            cout << "La segunda palabra es mayor" << endl;
 
    return 0;
}
 

Las precauciones que debemos tener son las mismas que en el caso de C (se compara como en un diccionario, pero consderando que las mayúsculas son menores que las minúsculas, y podemos tener problemas con las vocales acentuadas y otros símbolos que no sean parte del alfabeto inglés).

Ejercicio propuesto:

  • (6.2.6.1) Crear un programa que pida al usuario su contraseña. Deberá terminar cuando introduzca como contraseña la palabra "clave", pero volvérsela a pedir tantas veces como sea necesario.
  • (6.2.6.2) Crear un programa que pida al usuario su nombre y su contraseña, y no le permita seguir hasta que introduzca como nombre "Pedro" y como contraseña "Peter".

6.2.7. Convertir a cadena "al estilo C"

Muchas órdenes existentes en C y en C++ esperan que, si se le indica algún texto, éste sea "al estilo de C" (un array de caracteres), y no trabajan correctamente con datos de tipo "string".

No es un gran problema: podemos obtener una cadena "al estilo C" a partir de un string si le añadimos al final ".c_str()"

printf("%s", texto.c_str());

Ejercicio propuesto:

  • (6.2.7.1) Crear un programa que pida al usuario su nombre (como "string") y luego lo muestre usando "printf".

Actualizado el: 14-09-2013 13:52

AnteriorPosterior